Наследование и списки - PullRequest
3 голосов
/ 22 мая 2011

Class B extends class A.У меня есть список B (List<B> list1), но для некоторых операций мне нужны только поля класса A, но List<A> list2 = list1 не работает. Как решить эту проблему?

Ответы [ 2 ]

4 голосов
/ 22 мая 2011
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
}
3 голосов
/ 22 мая 2011

Обобщения являются строгими по типу, они не поддерживают ко-вариантные типы, такие как массив.

...