Объяснение принципа get-put

Я прочитал книгу О'Рейли, в которой я познакомился с этим принципом get-put.

  • Используйте extends подстановочный знак, если только вы получите значения из структуры.
  • Используйте super подстановочный знак, когда вы введете только значение в структуру.
  • И не используйте подстановочный знак, когда вы оба хотите получить и поместить из/в структуру.

Исключения:

  • Вы не можете помещать что-либо в тип, объявленный с помощью шаблона extends, за исключением значения null, которое относится ко всем типам ссылок.

  • Вы не можете получить что-либо из типа, объявленного с помощью шаблона super, за исключением значения типа Object, который является супер-типом каждого ссылочного типа.

Может ли кто-нибудь помочь мне изучить это правило на глубине? Если возможно, укажите их иерархически.

Ответ 1

Рассмотрим кучу бананов. Это Collection<? extends Fruit> в том, что это коллекция определенного вида фруктов, но вы не знаете (из этой декларации), какой плод он представляет собой коллекцию. Вы можете получить предмет от него и знать, что это определенно будет плодом, но вы не можете добавить к нему - вы можете попробовать добавить яблоко в кучу бананов, что определенно будет ошибкой. Вы можете добавить null к нему, так как это будет допустимым значением для любого вида фруктов.

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

(В общем, для вопросов с генераторами Java, Часто задаваемые вопросы Java Generics - отличный ресурс, который содержит ответ на почти любые связанные с генериками "Вероятно, на нее набросится.)