Преобразование подкласса ArrayList в ArrayList
Im использует ArrayList и im пытается скопировать часть его в другой ArrayList, поэтому im использует:
sibling.keys = (ArrayList<Integer>) keys.subList(mid, this.num);
Где "sibling.keys" - это новый ArrayList, а "keys или this.keys" - это старший ArrayList.
Я использовал кастинг, потому что затмение велело мне это сделать, но затем оно выбрасывает ClassCastException
:
java.util.ArrayList $SubList не может быть добавлен в java.util.ArrayList
Любые советы?
Ответы
Ответ 1
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
? Вы хотите, чтобы мутация одного списка влияла на другой?
Ответ 2
Вы получаете исключение класса, потому что вы ожидаете ArraList, в то время как ArrayList.subList() не возвращает ArrayList.
Измените свои sibling.keys из ArrayList на List и должны работать нормально. Это позволит исключить ClassCastException, а также вам не нужно будет и кастинг.
Ответ 3
Array.subList
не возвращает ArrayList
, но a List
.
Итак, работает следующая строка:
List<Integer> keys = (List<Integer>) keys.subList(mid, this.num);
Обратите внимание, что литье не является обязательным.