2013-04-18 35 views
1

在下面的代碼中,我希望pn.get(8).get(8)返回一個數組Integers(在這個例子中,數組長度爲1,但在我的程序中它更長) 。相反,我得到一組ObjectsHashSet「無法從元素類型Object轉換爲Integer」當期待整數HashSet

有人可以告訴我爲什麼和我做錯了什麼。

ArrayList<ArrayList<HashSet<Integer>>> pn = 
    new ArrayList<ArrayList<HashSet<Integer>>>(); 

for (int x = 0; x < 9; x++) 
{ 
    pn.add(x, new ArrayList<HashSet<Integer>>()); 

    for (int y = 0; y < 9; y++) { 
     pn.get(x).add(y, new HashSet<Integer>()); 
     pn.get(x).get(y).add(new Integer(x)); 
    } 
} 


for (Integer i: pn.get(8).get(8).toArray()) 
{ 
    System.out.println(i); 
} 
+0

你怎麼知道你正在獲取一組對象?你是否遇到異常? – drewmoore

+0

yes:線程「main」中的異常java.lang.Error:未解決的編譯問題: \t類型不匹配:無法從元素類型Object轉換爲Integer –

+1

請參閱我的答案... – drewmoore

回答

3

所有你需要做的就是刪除您for語句,該語句返回Object[]而不是Integer[]你可能已經預期toArray()電話。這是一個如何Java implements generics using type erasure的神器。運行時,JVM不知道你的HashSetInteger類型,所以toArray()必須返回一個數組Object[]

謝天謝地,HashSet可以直接迭代,所以toArray()調用是不必要的。對我來說,以下工作:

ArrayList<ArrayList<HashSet<Integer>>> pn = new ArrayList<ArrayList<HashSet<Integer>>>(); 

for (int x = 0; x < 9; x++) 
{ 
    pn.add(x, new ArrayList<HashSet<Integer>>()); 

    for (int y = 0; y < 9; y++) { 
     pn.get(x).add(y, new HashSet<Integer>()); 
     pn.get(x).get(y).add(new Integer(x)); 
    } 
} 


for (Integer i: pn.get(8).get(8)) 
{ 
    System.out.println(i); 
} 
1

取出toArray(),它返回一個Object[],而你循環變量是一個Integer,因此錯誤。

for (Integer i: pn.get(8).get(8)) 
    { 
     System.out.println(i); 
    } 
1

<Collection>.toArray默認將返回一個無類型(Object)陣列。要鍵入它,也就是(你的情況Integer)要使用哪種類型,使用方法:

Integer[] integers = pn.get(8).get(8).toArray(new Integer[pn.get(8).get(8).size()]); 
1

出現這種情況的類型擦除(See oracle doc here),當你調用指定者成爲一個問題的結果()。由於HashSet的是一個可迭代的收集,調用指定者()是不必要的反正:您可以簡單地使用for (Integer i: pn.get(8).get(8))

1

如果你真的想在陣列試試這個

HashSet<Integer> temp = pn.get(8).get(8); 
    Integer i[] = new Integer[temp.size()] ; 

    for (Integer j: temp.toArray(i)) { 
     System.out.println(j); 
    } 

否則

for (Integer j: pn.get(8).get(8)){ 
     System.out.println(j); 
    } 

會工作很好。