2013-05-20 2 views
25

Im используя ArrayList и им пытаются скопировать ее часть другому ArrayList поэтому им с помощью:Преобразование подсписка в ArrayList к ArrayList

Где «sibling.keys» является новым ArrayList и «keys или this.keys» - это старший ArrayList. я использовал кастинг, потому что затмение сказал мне, чтобы сделать это, но потом бросает ClassCastException:

java.util.ArrayList $ Подсписок не может быть приведен к 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

Он уже возвращает 'List '. Это литье является излишним. – IlyaEremin

0

Вы получаете исключение класса, потому что вы ожидаете ArraList, в то время как ArrayList.subList() не возвращает ArrayList. Измените свои sibling.keys от ArrayList до List, и он должен работать нормально. Это позволит исключить ClassCastException, а также вам не понадобится и любой бросок.