Почему мы не можем сделать List <Parent> mylist = ArrayList <child>();
Почему мы не можем сделать
List<Parent> mylist = ArrayList<child>();
Ответ 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);
но он не знает, какой именно вид фрукта он представляет собой, и убедитесь, что вы не можете сделать не то, что нужно.
Потому что они не одного типа. Предположим, что у вас был еще один дочерний класс 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);
Это просто, что прямая трансляция не поддерживается.