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