2014-01-24 34 views
1

我不明白爲什麼這是給我一個類轉換異常:的ArrayList的toArray方法類轉換異常

List<String> names = new ArrayList<String>(); 
for (ApplicationInfo app : apps) { 
    names.add("" + app.loadLabel(packageManager)); 
} 
return (String[]) names.toArray(); 

日誌是:

01-23 16:56:18.746: E/AndroidRuntime(4027): Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]

但我明確names到列表String而不是Object

**編輯:

哦,等等,好吧,我在API中看到它返回對象數組。我怎麼能這樣做,沒有做:

List<String> names = new ArrayList<String>(); 
for (ApplicationInfo app : apps) { 
    names.add("" + app.loadLabel(packageManager)); 
} 
String[] list = new String[names.size()]; 
return names.toArray(list); 

並每次創建一個新的數組?

+0

你可以在Array列表上循環並將數組中的字符串壓入並返回它 –

回答

3

類轉換異常發生,只是因爲指定者()回報對象[]。肯定對象[]不能投到字符串[]

Insteadly,您可以使用此:

String[] list = toArray(new String[names.size()]); 

返回正確的投(字符串[])。

1

你只需要,無論是由你直接或間接。有人需要創建一個數組(具有正確的大小)來保存結果。

new String[0]是虛擬的,但您將創建兩個對象。

如果您認爲另外一個數組對象很重要,那麼您應該重用String []對象,或者僅使用List而不轉換爲數組。

+0

超過10k代表併發布答案而不是標記爲dup?如果這個答案比重複更好或更完整,那麼會飛,但這... –

0

你可以這樣做,而不是:

String[] list = new String[0]; 
return names.toArray(list); 

你並不需要分配額外的空間,爲您數組的大小。

+0

首先這個答案沒有提供任何解釋。其次這個問題顯然是重複的。第三,爲什麼分配兩個數組? –

+0

@BoristheSpider她需要更多的堆棧溢出點:'( –

2

基礎上javadoc,你可以這樣做:

String[] list = names.toArray(new String[0]); 
1

您正在研究泛型,並且在運行時無法確定要創建的數組類型以及要分配給該數組的大小。

一個非常簡單的工作解決方案。

ApplicationInfo a1 = new ApplicationInfo("label1"); 
    ApplicationInfo a2 = new ApplicationInfo("label2"); 
    ApplicationInfo a3 = new ApplicationInfo("label3"); 

    List<ApplicationInfo> infos = new ArrayList<ApplicationInfo>(); 
    infos.add(a1); 
    infos.add(a2); 
    infos.add(a3); 

    ArrayList<String> labels = new ArrayList<String>(); 
    for (ApplicationInfo info : infos) { 
     labels.add(info.getLabel().toString()); 
    } 

    String[] lbls = labels.toArray(new String[labels.size()]); 
    for (int i = 0; i < lbls.length; i++) { 
     System.out.println(lbls[i]); 
    }