2013-11-21 121 views
2

爲什麼下面的代碼無法執行,雖然它不會檢測到來自IDE的錯誤。它會編譯得很好。ArrayList無法使用(String [])list.toArray()轉換爲String數組。爲什麼?

ArrayList<String> a = new ArrayList<String>(); 
    a.add("one"); 
    a.add("two"); 
    a.add("three"); 
    String [] b = (String[])a.toArray(); 
    for(int i =0;i<b.length;++i){ 
     System.out.println(b[i]); 
    } 

但它會給出以下錯誤。

嵌套異常是java.lang.ClassCastException:[Ljava.lang.Object;不能將[ ]轉換爲[Ljava.lang.String;

任何人都可以給出一個明確的解釋嗎?之前已經問過同樣的問題,並提供了一些解決方案。但對這個問題的明確解釋將非常感謝。

回答

3

你應該簡單地做:

String[] b = new String[a.size()]; 
a.toArray(b); 

你得到的錯誤,因爲toArray()回報Object[],這不能被拋棄到String[]

+0

肯定。但爲什麼上述不起作用。我只需要知道爲什麼我們不能使用它。 – prime

+0

我正在編輯.... – Maroun

+2

誰downvoted?爲什麼?我真的很想從我的錯誤中學習。不要低估,不要提及爲什麼..這是一個非常不好的習慣。 – Maroun

3

您需要提及數組類型,否則默認情況下,toArray()將返回一個數組Object,該數組不能簡單地轉換爲String[]。如果指定了類型,則將調用超載toArray(T[]),並返回提到的數組類型作爲參數。

String [] b = a.toArray(new String[]{}); 
0

看一看的JavaDoctoArray()返回Object[]數組,不能垂頭喪氣到String[]

你需要this method代替 - 原因是,泛型是在運行時被刪除,因此JVM將不知道你ArrayList曾經是一個包含String的:

String [] b = a.toArray(new String[] {}); 

乾杯,

+0

如果您在參數中指定類型,則不需要投射它! :) – SudoRahul

+0

@ R.J Argh,你當然是對的 - 這就是從這個問題的副本寄存給你... –

3

a.toArray()正在創建Object[]而不是String[],因此類型轉換失敗。

String[] b = a.toArray(new String[a.size()]); 

參考JavaDocs爲List.toArray

0

兩個重載

由於1.5你能做到這一點的方式(一些可能在現在/未來的幫助。):

for(String output : a) { // Loops through each a (which is a String) 
System.out.println(output); // As it is a String list we can just print it 
} 

這更具可讀性,可能會派上用場瞭解。

輸出:

one 
two 
three 
+1

是的..但我做了印刷的東西只是爲了檢查。 :)並感謝你的想法:) (實際上我的問題不是如何打印列表元素):) – prime

相關問題