Ответ 1
Рассмотрим кучу бананов. Это Collection<? extends Fruit>
в том, что это коллекция определенного вида фруктов, но вы не знаете (из этой декларации), какой плод он представляет собой коллекцию. Вы можете получить предмет от него и знать, что это определенно будет плодом, но вы не можете добавить к нему - вы можете попробовать добавить яблоко в кучу бананов, что определенно будет ошибкой. Вы можете добавить null
к нему, так как это будет допустимым значением для любого вида фруктов.
Теперь рассмотрим фруктовый куб. Это Collection<? super Banana>
, потому что это набор некоторого типа "больше, чем" Banana
(например, Collection<Fruit>
или Collection<TropicalFruit>
). Вы можете определенно добавить банан к этому, но если вы возьмете предмет из чаши, вы не знаете, что вы получите - это может быть не банан. Все, что вы знаете наверняка, это то, что это будет действительная (возможно null
) Object
ссылка.
(В общем, для вопросов с генераторами Java, Часто задаваемые вопросы Java Generics - отличный ресурс, который содержит ответ на почти любые связанные с генериками "Вероятно, на нее набросится.)