2011-06-06 34 views
6

對不起,我想不出一個更簡潔的標題。仿製藥問題和陣列

我的問題是,爲什麼下面這段代碼的工作:

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   
    } 
} 
} 

我知道我能避開這個問題,現在讀您的答覆後,但我很好奇。任何人都可以從這個特點中瞭解一些情況嗎?

再次感謝。

+0

這是如此好的問題。我在最後5分鐘考慮它,不知道答案! – AlexR 2011-06-06 18:35:59

+0

請!給我們[SSCCE](http://sscce.org)樣式的代碼片段。 – MockerTim 2011-06-06 18:43:38

回答

4

由於Object[]對於所有T都是T[]的超類,但對於除Object之外的任何T都不是子類型,因此投中失敗。

如果您在運行時有Class<T>可用,則可以使用Array.newInstance創建T[]

1

你可以嘗試使用數組是類型T

的這裏是你如何管理:How to create a generic array in Java?

無論使用的強或弱類型。你正在嘗試使用弱類型。

+1

對不起,男人,但這樣的事情根本不起作用。它沒有通過compillation。 – AlexR 2011-06-06 18:28:39

+0

你說得對。你可以使用下面的代碼:[link](http://stackoverflow.com/questions/529085/java-how-to-generic-array-creation) – rambo 2011-06-06 18:36:04

+0

我認爲這不起作用,因爲Java中的數組不是通用的。 – gpeche 2011-06-06 18:37:56

1

Java中的數組不是通用的,因此您不能將Java泛型應用於數組。特別是,如果您在構造函數中執行的操作從Object[]T[]錯誤,並且很可能是錯誤的原因。

知道了這一點,你可以在你需要實例化的東西是不是一個通用類中通用的使用您使用同樣的伎倆:通過特定的類對象

TObjectPool(int size, Class<T> klass) { 
    availableObjects = Array.newInstance(klass, size); 
} 
... 
protected class RenderElementPool extends TObjectPool<RenderElement>{ 
    // Pass the class object to super constructor 
    public RenderElementPool(int size) { 
     super(size, RenderElement.class); 
    } 
    ... 
    @Override 
    public void fill() { 
     for (int i = 0; i < capacity; i++) { 
      availableObjects[i] = new RenderElement(); 
     } 
    } 
}