![](/img/trans.png)
[英]java: (String[])List.toArray() gives 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
在運行時不可用,因此我們無法構造T
或T[]
的實例。 但是,存在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.