Подстановочные знаки в универсальных шаблонах: «? супер Т »работает пока«? extends T ”нет?

Мой вопрос о дженериках в 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 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 = ... все работает нормально и компилятор ничего плохого не говорит. Почему в этом случае он работает нормально, а в приведенном выше примере - нет?

5
задан Community 23 May 2017 в 12:00
поделиться