java genérico e curinga

Em java genérico eu entendi quais são os significados do curinga, super e estende, mas não entendi por que não me permite adicionar nada e por que me permite adicionar o SomeType na hierarquia, mas não acima na hierarquia?

class Animal {}
class Cat extends Animal{}

método @following pode ter uma lista de Animal ou sub de Animal, ou seja, Gato, mas nada mais e não tenho permissão para adicionar nada, se tentar adicionar, o compilador me interrompe por que?

void addAminal(List<? extends Aminal> aList){
       aList.add(new Cat()); // compiler error
       aList.add(new Animal()); // compiler error
}

Agora, o método a seguir pode levar qualquer lista de animais ou qualquer super tipo de animal, mas nenhum sub-tipo de animal, e eu posso adicionar objetos até Animal ou menos na hierarquia; portanto, quando tento adicionar Objeto, o compilador reclama por quê?

void addAnimal(List<? super Animal> aList){
     aList.add(new Animal()); // no error
     aList.add(new Cat());     // no error
     aList.add(new Object()); // compiler error why ?
}

Obrigado Arya

questionAnswers(4)

yourAnswerToTheQuestion