2008-09-16 100 views
18

在Java集合框架,Collection接口聲明瞭以下方法:如何在運行時實例化給定數組類型的Java數組?

<T> T[] toArray(T[] a)

返回包含此集合中的元素的陣列;返回數組的運行時類型是指定數組的運行時類型。如果集合適合指定的數組,則將其返回。否則,將使用指定數組的運行時類型和此集合的大小分配新數組。

如果你想實現這個方法,你會如何創建一個類型的數組,僅在運行時知道的?

回答

3
Array.newInstance(Class componentType, int length) 
19

通過觀察ArrayList中是怎麼做的:

public <T> T[] toArray(T[] a) { 
    if (a.length < size) 
     a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size); 
    System.arraycopy(elementData, 0, a, 0, size); 
    if (a.length > size) 
     a[size] = null; 
    return a; 
} 
-1

要創建一個通用類型的新數組(僅在運行時才知道),您必須創建一個數組的對象,並簡單地將其轉換爲泛型類型,然後像這樣使用它。這是Java(擦除)的泛型實現的限制。

T[] newArray = (T[]) new Object[X]; // where X is the number of elements you want. 

然後,該函數取給定的所述陣列(a)和使用它(檢查它的大小預先)或創建一個新的。

+3

與其他所有答案不同,這種方法不會創建T的數組。由於刪除可以將其分配給T [],但是您不會總是避開它。如果在一個特定的實例中T是String,並且你在那裏創建的數組是(返回給另一個方法並且)被賦值給String [](不需要轉換),你會得到一個意外的ClassCastException。這是一種類型污染的例子。不要這樣做! – 2011-04-11 15:05:23

相關問題