Клетка должна быть в состоянии содержать обоих типов животных.«супер» говорит, что - это говорит о том, что Клетка должна быть способна содержать всех животных - и, возможно, некоторые другие вещи, потому что ? super Animal
может быть суперклассом Animal.«extends» говорит, что он может содержать некоторых видов животных - возможно, просто львов, например, как в:
Cage<? extends Animal> cage = new Cage<Lion>();
, что будет правильным утверждением, но, очевидно, клетка льване будет держать бабочек, поэтому
cage.add(new Butterfly());
не скомпилируется.Оператор
cage.add(new Lion());
также не будет компилироваться, потому что здесь Java смотрит на объявление клетки - Cage<? extends Animal>
, а не на объект, который ей назначен прямо сейчас (Cage<Lion>
).
Лучшее описание дженериков, о которых я знаю, содержится в Java О'Рейли в двух словах .Глава бесплатна онлайн - часть 1 и часть 2 .