Подтвердить что ты не робот

Преобразование подкласса 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

Любые советы?

4b9b3361

Ответ 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);

Обратите внимание, что литье не является обязательным.