Мой вопрос о дженериках в Java 7. Предположим, у нас есть такая иерархия классов:
interface Animal {}
class Lion implements Animal {}
class Butterfly implements Animal {}
Так же, как в Учебное пособие по Java Generics
Также у нас есть класс
class Cage {
private List 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 >
. Но я говорю компилятору расширяет Animal>
, поэтому тип T
в Cage
будет любым из подтипов типа Animal. Так почему же он по-прежнему выдает ошибку времени компиляции?
Вопрос №2:
Если я укажу Cage super Animal> cage = ...
вместо Cage extends Animal> cage = ...
все работает нормально и компилятор ничего плохого не говорит. Почему в этом случае он работает нормально, а в приведенном выше примере - нет?