請閱讀該問題,而不是假設這是重複的。使用toArray將列表轉換爲數組
在我對我的工作的代碼庫中的Foo對象的列表:
private List<Foo> fooList;
可能有人請向我解釋這行代碼之間的差值(S):
Foo foos[] = fooList.toArray(new Foo[fooList.size()]);
和這條線?
Foo foos[] = (Foo[]) fooList.toArray();
請閱讀該問題,而不是假設這是重複的。使用toArray將列表轉換爲數組
在我對我的工作的代碼庫中的Foo對象的列表:
private List<Foo> fooList;
可能有人請向我解釋這行代碼之間的差值(S):
Foo foos[] = fooList.toArray(new Foo[fooList.size()]);
和這條線?
Foo foos[] = (Foo[]) fooList.toArray();
不同的是,第二人會拋出一個ClassCastException
在運行時。無參數List#toArray()
方法會在內部創建一個Object[]
,您無法將其轉換爲Foo[]
。由於通用類型信息被編譯器擦除,列表的類型在運行時不知道。因此,您無法知道創建數組的實際類型(即,您無法創建類似於 - new T[size]
的數組)。這就是爲什麼它創建了一個Object[]
。
爲了解決這個問題,有一個通用的方法List#toArray(T[])
在那裏,你可以傳遞實際的數組,這個數組將被ArrayList
的元素填充。如果數組的大小不足以適應元素,則會在內部創建一個新數組。所以,由於您通過了new Foo[fooList.size()]
,它將被列表中的元素填充。但是,如果您通過了new Foo[0]
,則會創建一個新陣列。
第二種方法是錯誤的。
類型的fooList.toArray();
是對象[]
第一種方法是鍵入。您創建一個具有正確類型和尺寸(new Foo[fooList.size()]
)新的數組,然後,您可以使用fooList.toArray()
你也可以使用fooList.toArray(new Foo[0])
但是這會給你一個額外的空數組對象填充它。
toArray的作品很簡單。如果您不帶參數地調用它,則會創建新的Object []。
如果您給一個正確類型的數組,它會嘗試填充它,如果它有足夠的空間或放棄它,並創建具有給定類型的新數組。
如果你問以下方法之間的區別;
list.toArray(array);
list.toArray();
首先方法將嘗試在列表中的元素融入給出array
例如,如果失敗,則創建新的數組,然後繼續。返回數組的運行時類型也是指定數組的運行時類型。
第二種方法創建一個新數組並繼續,返回類型爲Object[]
在您的示例中導致類拋出異常。
Using asList()
方法
List<String> list = Arrays.asList(array);
轉到下面的鏈接: http://javaxtutorials.blogspot.in/p/converting-array-as-list-and-list-to.html
如何解決這個和/或解決? – Josh
@SoylentGreen使用第一種方法... – arshajii
@SylentGreen你已經有了一個。 –