Ответ 1
Josh Bloch Мнемонический PECS полезен здесь. Это означает:
Производитель extends
, Потребитель super
Это означает, что когда параметризованный тип, передаваемый методу, генерирует экземпляры T
(они будут извлечены из него каким-либо образом), следует использовать ? extends T
, поскольку любой экземпляр подкласса T
также является T
.
Когда параметризованный тип, передаваемый методу, будет потреблять экземпляры T
(они будут переданы ему, чтобы что-то сделать), следует использовать ? super T
, потому что экземпляр T
может быть юридически передан любому метод, который принимает некоторый супертип T
. Например, A Comparator<Number>
можно использовать на Collection<Integer>
. ? extends T
не будет работать, поскольку Comparator<Integer>
не может работать с Collection<Number>
.
Edit: Чтобы прояснить немного больше о get/put (производить/потреблять):
public T something();
^
Вышеупомянутый метод, который создает T
.
public void something(T t);
^
Вышеупомянутый метод, который потребляет T
.
"Производитель extends
, Потребитель super
" применяется к тому, как метод, которым параметризованный объект передается, будет использовать этот объект. В случае Collections.max()
элементы будут извлекаться из Collection
, поэтому он является производителем. Эти элементы будут переданы в качестве аргументов методу на Comparator
, поэтому он является потребителем.