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

Ответы на вопрос(1)

Ваш ответ на вопрос