2013-05-20 83 views
25

林和IM嘗試它的一部分複製到另一個的ArrayList因此即時通訊使用:使用一個ArrayList轉換一個ArrayList的子列表到一個ArrayList

其中「sibling.keys」是新的ArrayList和「keys or this.keys」是較早的ArrayList。 我用鑄件,因爲日食告訴我這樣做,但後來它拋出一個ClassCastException

的java.util.ArrayList $ SUBLIST不能轉換爲java.util.ArrayList中

有什麼建議?

回答

71

subList在現有列表上返回視圖。這不是ArrayList。您可以創建一個副本它:

sibling.keys = new ArrayList<Integer>(keys.subList(mid, this.num)); 

或者,如果你很高興與視圖的行爲,嘗試改變的sibling.keys類型只是List<Integer>而不是ArrayList<Integer>,這樣你就不需要使副本:

sibling.keys = keys.subList(mid, this.num); 

,你理解上的差異,雖然是很重要的 - 你要變異sibling.keys(例如,增加值,或改變現有的元素)?你要改變keys?你想要突變一個列表來影響另一個列表嗎?

+0

對我而言,另一個簡單的選擇是sibling.keys.addAll(keys.subList(mid,this.num)); 這是假定sibling.keys已被初始化。 addAll()只是複製子列表的每個項目。 –

-1

Array.subList不返回ArrayList,而是List

所以下面的行工作:

List<Integer> keys = (List<Integer>) keys.subList(mid, this.num); 

注,中投是可選的。

+1

它已經返回'列表'。這個演員是多餘的。 – IlyaEremin

0

因爲您期待ArraList而ArrayList.subList()不返回ArrayList,所以您將得到類轉換異常。 將您的sibling.keys從ArrayList更改爲列表,並應該正常工作。這將避免ClassCastException以及您不需要和任何強制轉換。