2013-11-20 35 views
0

請閱讀該問題,而不是假設這是重複的。使用toArray將列表轉換爲數組

在我對我的工作的代碼庫中的Foo對象的列表:

private List<Foo> fooList; 

可能有人請向我解釋這行代碼之間的差值(S):

Foo foos[] = fooList.toArray(new Foo[fooList.size()]); 

和這條線?

Foo foos[] = (Foo[]) fooList.toArray(); 

回答

6

不同的是,第二人會拋出一個ClassCastException在運行時。無參數List#toArray()方法會在內部創建一個Object[],您無法將其轉換爲Foo[]。由於通用類型信息被編譯器擦除,列表的類型在運行時不知道。因此,您無法知道創建數組的實際類型(即,您無法創建類似於 - new T[size]的數組)。這就是爲什麼它創建了一個Object[]

爲了解決這個問題,有一個通用的方法List#toArray(T[])在那裏,你可以傳遞實際的數組,這個數組將被ArrayList的元素填充。如果數組的大小不足以適應元素,則會在內部創建一個新數組。所以,由於您通過了new Foo[fooList.size()],它將被列表中的元素填充。但是,如果您通過了new Foo[0],則會創建一個新陣列。

+0

如何解決這個和/或解決? – Josh

+4

@SoylentGreen使用第一種方法... – arshajii

+0

@SylentGreen你已經有了一個。 –

1

第二種方法是錯誤的。

類型的fooList.toArray();是對象[]

第一種方法是鍵入。您創建一個具有正確類型和尺寸(new Foo[fooList.size()])新的數組,然後,您可以使用fooList.toArray()

你也可以使用fooList.toArray(new Foo[0])但是這會給你一個額外的空數組對象填充它。

toArray的作品很簡單。如果您不帶參數地調用它,則會創建新的Object []。

如果您給一個正確類型的數組,它會嘗試填充它,如果它有足夠的空間或放棄它,並創建具有給定類型的新數組。

1

如果你問以下方法之間的區別;

list.toArray(array); 
list.toArray(); 

首先方法將嘗試在列表中的元素融入給出array例如,如果失敗,則創建新的數組,然後繼續。返回數組的運行時類型也是指定數組的運行時類型。

第二種方法創建一個新數組並繼續,返回類型爲Object[]在您的示例中導致類拋出異常。

+0

謝謝。這是第一行代碼所需的解釋。我想知道爲什麼它創建了一個新的陣列。顯然它會在失敗時創建一個新的。 – Josh

+0

儘管普遍的共識似乎表明第二種方法在運行時會失敗...... – Josh

+0

是的,因爲Object []被返回,所以肯定會導致異常。希望您可以考慮將此標記爲接受的答案呢? – lkamal