對不起,我想不出一個更簡潔的標題。仿製藥問題和陣列
我的問題是,爲什麼下面這段代碼的工作:
public abstract class TObjectPool<T> {
protected Object[] availableObjects;
TObjectPool(int size){
availableObjects = new Object[size];
}
protected class RenderElementPool extends TObjectPool<RenderElement>{
@Override
public void fill() {
for (int i = 0; i < capacity; i++) {
availableObjects[i] = new RenderElement();
}
}
}
時,它不會工作使對象數組的通用像這樣:
public abstract class TObjectPool<T> {
protected T[] availableObjects;
TObjectPool(int size){
availableObjects = (T[]) new Object[size];
}
當availableObjects [I] = new RenderElement();行在後面的例子中執行我得到一個ClassCastException。我明白爲什麼它在第一個例子中有效,但不是爲什麼它不在第二個例子中。 availableObjects應該是一個RenderElement數組,我試圖給它一個RenderElement。我錯過了哪些關鍵信息?
感謝您的幫助。
更新...
非常感謝您的答覆。我想我理解,但我已成功地再次混淆自己:
如果我的函數添加:
public void add(int index, T object){
availableObjects[index] = object;
}
到TObjectPool類。它會很高興地使用T []數組。
所以新TObjectPool和子類池如下:
public abstract class TObjectPool<T> {
T[] availableObjects;
TObjectPool(int size){
availableObjects = (T[])new Object[size];
capacity = size;
count = capacity;
fill();
}
public void add(int index, T object){
availableObjects[index] = object;
}
protected class RenderElementPool extends TObjectPool<RenderElement>{
@Override
public void fill() {
for (int i = 0; i < capacity; i++) {
add(i, new RenderElement()); //this works
//availableObjects[i] = new RenderElement(); //this gives an exception
}
}
}
我知道我能避開這個問題,現在讀您的答覆後,但我很好奇。任何人都可以從這個特點中瞭解一些情況嗎?
再次感謝。
這是如此好的問題。我在最後5分鐘考慮它,不知道答案! – AlexR 2011-06-06 18:35:59
請!給我們[SSCCE](http://sscce.org)樣式的代碼片段。 – MockerTim 2011-06-06 18:43:38