簡體   English   中英

List.toArray() 中的 ClassCastException

[英]ClassCastException in List.toArray()

有人可以向我解釋:

List<String> wordsList = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
String[] wordsArray = (String[]) wordsList.toArray();

今年秋天:線程“main”中的異常 java.lang.ClassCastException: [Ljava.lang.Object; 不能轉換為 [Ljava.lang.String;

 List<String> wordsList = Arrays.asList("one", "two", "three");        
 String[] wordsArray = (String[]) wordsList.toArray();

現在可以嗎? 有什么區別??

toArray()是舊的做事方式,回到我認為 1.5 的首選方式是使用toArray(T[])

List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
String [] words = list.toArray(new String[] {});
System.out.println(Arrays.toString(words));

List.toArray返回一個Object[] 通常,這種類型不能轉換為String[] 事實上,不能保證它一個String[] 在您的Arrays.asList示例中,看起來List<String>能夠獲取您傳遞給它的現有數組並制作一個(運行時) String[] ,但這是一個實現細節,隨時可能更改(並且,根據評論,甚至在 Java 個版本中也不一致)。

function 返回Object[]而不是T[]的原因是類型擦除 類型T在運行時不可用,因此我們無法構造TT[]的實例。 但是,存在toArray的重載,它將值放入T[]中,但必須提供數組。 這解決了無法編寫new T[]的問題,因為提供數組是您作為調用者的工作,因此不需要進行新的分配。

String[] tmpArray = new String[10]; // Just an initial guess as to the size
String[] wordsArray = list.toArray(tmpArray); // Note: No cast necessary

wordsArray可能與tmpArray相同,或者它可能是tmpArray構造的擴展數據結構。 無論哪種方式,原始的tmpArray都應該被視為在此時被銷毀並且不再使用。

注意: String[]甚至是Object[]的子類型這一事實(即您建議的轉換永遠有效)是 Java 團隊做出的一個有問題的決定的結果,該決定使 arrays 協變,而實際上是一個可變數據結構,例如從數學上講,這應該是不變的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM