Подстановочные знаки в Generics: «? супер т "работает пока"? расширяет Т »не?
Мой вопрос о дженериках в Java 7. Предположим, у нас есть такая иерархия классов:
interface Animal {}
class Lion implements Animal {}
class Butterfly implements Animal {}
Прямо как вJava Generics Tutorial
Также у нас есть класс
class Cage<T> {
private List<T> arr = new ArrayList<>();
public void add(T t) {
arr.add(t);
}
public T get() {
return arr.get(0);
}
}
И вот код, который использует эти классы:
public static void main(String[] args) {
Cage<? extends Animal> cage = new Cage<>();
Animal a = cage.get(); //OK
cage.add(new Lion()); //Compile-time error
cage.add(new Butterfly()); //Compile-time error
}
Вопрос 1:
я прочиталВот об этих проблемах, но было просто какCage<?>
, Но я говорю компилятору<? extends Animal>
так типаT
вCage<T>
будет любой из подтипов животного типа. Так почему же это все равно дает ошибку времени компиляции?
Вопрос 2:
Если я укажуCage<? super Animal> cage = ...
вместоCage<? extends Animal> cage = ...
все работает нормально и компилятор не говорит ничего плохого. Почему в этом случае он работает нормально, а в приведенном выше примере не работает?