2013-05-20 25 views
25

im przy ArrayList i im próbuje skopiować jego część do innego ArrayList dlatego im przy:Konwersja podmenu ArrayList ArrayList

gdzie „sibling.keys” jest nowy i ArrayList "keys or this.keys" to starsza tablica ArrayList. użyłem casting bo zaćmienie kazał mi zrobić, ale to rzuca ClassCastException:

java.util.ArrayList $ podmenu nie mogą być oddane do java.util.ArrayList

jakąś radę?

Odpowiedz

71

subList zwraca widok z istniejącej listy. To nie jest ArrayList. Można utworzyć kopięniego:

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

lub jeśli jesteś zadowolony z zachowania widoku, spróbuj zmienić rodzaj sibling.keys po prostu być List<Integer> zamiast ArrayList<Integer>, tak że nie trzeba zrobić kopię:

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

To ważne, aby zrozumieć różnicę chociaż - idziesz do mutowania sibling.keys (np dodawanie wartości do niego lub zmiana istniejących elementów)? Czy zamierzasz zmutować keys? Czy chcesz, aby mutacja jednej listy wpłynęła na drugą?

+0

Inną łatwą opcją, która zadziałała dla mnie była sibling.keys.addAll (keys.subList (mid, this.num)); Zakłada się, że sibling.keys jest już zainicjowany. Funkcja addAll() po prostu kopiuje każdy element podlisty. –

-1

Array.subList nie zwraca wartości ArrayList, ale List.

więc następujący wiersz działa:

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

Zauważ, że obsada jest opcjonalne.

+1

To już zwraca 'List '. Ta obsada jest zbędna. – IlyaEremin

0

Otrzymujesz wyjątek klasy rzutowania, ponieważ oczekujesz ArraList, podczas gdy ArrayList.subList() nie zwraca ArrayList. Zmień swoje sibling.keys z ArrayList na listę i powinno działać poprawnie. Pozwoli to uniknąć wyjątku ClassCastException, a także nie będzie konieczne i nie będzie rzutowania.