List<? extends A> list2 = list1;
Это означает «список определенного подтипа A
».
Если бы вы могли использовать List<A>
, что означает «список A и всех его подклассов», вы потеряли бы безопасность времени компиляции. Представьте себе:
List<B> list1 = ..;
List<A> list2 = list1;
list2.add(new C());
for (B b : list1) {
//ClassCastException - cannot cast from C to B
}