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

Почему мы не можем сделать List <Parent> mylist = ArrayList <child>();

Почему мы не можем сделать

List<Parent> mylist = ArrayList<child>();
4b9b3361

Ответ 1

Предположим, что мы могли бы. Тогда эта программа должна быть в порядке:

ArrayList<Banana> bananas = new ArrayList<Banana>();
List<Fruit> fruit = bananas;
fruit.add(new Apple());

Banana banana = bananas.get(0);

Это явно не безопасный тип - вы попали в яблоко в коллекции бананов.

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

List<? extends Fruit> fruit = new ArrayList<Banana>();

это безопасно, потому что компилятор не позволит вам попытаться добавить в список фруктов. Он знает, что это список какого-то плода, поэтому вы можете написать:

Fruit firstFruit = fruit.get(0);

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

См. Часто задаваемые вопросы по генерации Java).

Ответ 2

Потому что они не одного типа. Предположим, что у вас был еще один дочерний класс Parent (Child2 для аргумента), тогда можно было бы поместить экземпляр Child2 в List<Parent>, но неверно ввести тип в экземпляр от List<Child>. Ковариантное наследование является настоящей головной болью и поддерживается только в Java для типов массивов (где это может вызвать нечетные проблемы).

Ответ 3

Это должно быть так, потому что мы можем сделать: Родитель A = новый Child();

Изменить: Подождите, на самом деле это работает:

List<Parent> list = new ArrayList<Parent>(); List<ChildA> tmp = new ArrayList<ChildA>(); list.addAll(tmp); List<ChildB> tmp2 = new ArrayList<ChildB>(); list.addAll(tmp2);

Это просто, что прямая трансляция не поддерживается.