2017-03-09 43 views
1

我的代碼看起來像這樣拋出:ArrayStoreException信息時將HashSet的數組

int[] ho = new int[10]; 
    ho[0]= 1; 
    ho[2]= 1; 
    ho[4]= 5; 

    HashSet<Integer> hs = new HashSet(Arrays.asList(ho)); 

    Integer[] a = hs.toArray(new Integer[hs.size()]); 

該代碼可以完美的我,但是當我運行它,它拋出一個ArrayStoreException。這是爲什麼? HashSet是一組Integer s,輸出數組也是如此。

回答

3

ArrayStoreException:「如果指定數組的運行時類型不是運行時類型在這個集合中的每個元素的超類型」

ArrayStoreException被拋出,指示嘗試已經取得存儲錯誤的類型將對象轉換爲對象數組。

嘗試切換int[] to Integer[]

1

的問題是,你跳過泛型類型,所以你看不到的錯誤和Java是無法拒絕你的代碼,即使它是錯的。

的問題是,的Arrays::asList簽名asList(T... values),但這樣的可變參數被摺疊成int[](這是現在的對象)和Arrays.asList返回List<int[]>T不能是原始的。

然後將它傳遞給一個通用的HashSet構造函數,然後接受Collection<Object>沒有任何問題,並將其分配給,編譯器會警告您使用原始類型。

最後你嘗試分配中的哈希集合中的元素(這是int[]類型)以元素在Integer[]陣列產生例外,那就是喜歡做

Integer[] data = new Integer[5]; 
data[0] = new int[] {1, 2, 3}; 

這是錯誤的,但Java可以不在編譯時實現它。

如果您構建了HashSetnew HashSet<>,那麼Java編譯器會產生錯誤。您可以通過將Integer[]傳遞給asList方法來解決此問題,以便將其正確對待爲可變參數。