Как преобразовать список общих подтипов в список определенного подтипа? - PullRequest
0 голосов
/ 18 октября 2018

Предположим, класс B расширяет класс A, и у нас есть

List<? extends A> list1;
List<B> list2;

Есть ли способ присвоить list1 lsit2 без прохождения всех элементов?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Проще говоря, нет.

Причина в том, что у компилятора нет никаких доказательств того, что типы времени выполнения элементов list1 будут B (или любым подтипом B),Они могут иметь тип C extends A, что может привести к ClassCastException с во время выполнения.

Однако вы всегда можете пройти через list1 и добавить все элементы к list2, выполнив приведение (только если вы уверены, что типы совместимы, конечно).Даже если это сработает, это признак плохого дизайна.

0 голосов
/ 18 октября 2018

List<B> list2 = (List<B>)list1;

Вам придется иметь дело с предупреждением компилятора и, возможно, ClassCastExceptions при получении элементов из list2.

...