Литье по шаблонам - PullRequest
0 голосов
/ 26 июня 2019

Учитывая следующую иерархию классов

public class BaseClass {

}

public class ExtendedClass extends BaseClass{

}

Есть ли какая-либо причина, по которой я не могу привести экземпляр обобщенного класса, использующего baseClass, в тот же класс, используя расширенный?
например,

List<ExtendedClass> extendedList = (List<ExtendedClass>) new LinkedList<BaseClass>();

Есть ли способ получить подобное поведение, которое не заставляет меня добавлять все элементы из первого списка во второй.

1 Ответ

2 голосов
/ 26 июня 2019

Это запрещено, потому что в противном случае вы сможете сделать это.

List<Base> base = new ArrayList<>();
List<Extended> extended = (List<Extended>)base;

base.add(new OtherExtended()); // now you have OtherExtended in List<Extended>.

Вы можете заставить компилятор делать то, что вы хотите, List<ExtendedClass> extendedList = (List<ExtendedClass>)(Object) new LinkedList<BaseClass>();, но я советую вам этого не делать.

EDIT

Если у вас противоположная ситуация:

List<Extended> extended = new ArrayList<>();
List<Base> base = (List<Base>)base;

вы можете сделать

base.add(new OtherExtended());

и имеют ту же проблему. extended снова содержит неправильный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...