2016-03-21 115 views
1

陣列我測試此代碼:轉換集合類型來

Collection l = new ArrayList<Object>(); 

l.add(5); 
l.add("test"); 
l.add(6); 

Integer[] arr= l.toArray(new Integer[2]); 

我試圖從這個集合只能得到整數和得到這個異常:

Exception in thread "main" java.lang.ArrayStoreException 
    at java.lang.System.arraycopy(Native Method) 
    at java.util.Arrays.copyOf(Arrays.java:2248) 
    at java.util.ArrayList.toArray(ArrayList.java:389) 
    at c.Main.main(Main.java:15) 

可能存在其他的方式來過濾器,但我需要了解toArray(Object[] a)方法。爲什麼我不能通過告訴數組的類型和大小來進行過濾?

+4

'toArray'不適用於過濾集合;將一個特定類型的數組傳遞給'toArray'是一個將_whole_集合複製到該數組的指令。 –

回答

2

請看該方法的java文檔。每種方法按照它向外界聲明的合同工作(按照簽名或java文檔)。

<T> T[] toArray(T[] a); Clearly says in its java doc the below statement. 

拋出:ArrayStoreException信息 - 如果指定數組的運行時類型是不是每個元件的此集合中的運行時類型的超類型。

在你的情況下,你的每個元素的類型不是Integer

4

爲什麼我不能通過告訴數組的類型和大小來進行過濾?

因爲這不是toArray()所做的,並且它沒有說它可以用作過濾器。

函數& API的定義是他們所做的(有時候他們會這樣做,如何)。你不能期望一個函數能夠做到你想要它做的事情,如果它不是這樣做的。

4

toArray嘗試在給定數組中存儲整個集合。如果你想過濾它,你必須自己做。例如:

Integer[] arr = 
    l.stream().filter(x -> x instanceof Integer).toArray(Integer[]::new); 
+0

爲什麼回滾? –

+0

@YassinHajaj編輯不會提高代碼的可讀性 – Mureinik

+0

它確實改善了很多。 –