Присвоение коллекции подтипа родительскому типу - PullRequest
0 голосов
/ 09 мая 2018

Следующий код не выдает никакой ошибки:

List<A> l = new LinkedList<A>();
l.add(new B()); // B extends A

Тогда почему приведенная ниже ошибка дает:

List<B> l = new LinkedList<B>();
List<A> l1 = l;

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Это объясняется здесь - https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html

В основном List<A> рассматривается как отдельный (никак не связанный) тип из List<B>, поэтому при объявлении ссылки типа List<A> он не может указывать на объект типа List<B>.

Здесь есть хорошее обсуждение - Является ли List подклассом List ? Почему дженерики Java не являются неявно полиморфными?

0 голосов
/ 09 мая 2018

B расширяется A не означает List<B> расширяется List<A>. Присвоение коллекции подтипа родительскому типу сделает его небезопасным.

List<B> ListB = new LinkedList<B>();
List<A> ListA = ListB ;  // Suppose you can compile it without error
ListA.add(new C());  // You can put C into ListA if C extends A
B b = ListB.get(0); // Then when you retrieve from ListB, you get a C, not type safe!

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

List<B> ListB = new LinkedList<B>();
List<? extends A> ListSubA = ListB ;
ListSubA.add(new C()); // Compile error, a wildcard can prevent user putting C into it
ListB.add(new B());  // You can only add new element by ListB 
B b = ListB.get(0);  // Type safe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...