Объяснение принципа get-put
Я прочитал книгу О'Рейли, в которой я познакомился с этим принципом "получи и положи".
- Используйте
extends
подстановочный знак, когда вы только получаете значения из структуры.- Использовать
super
подстановочный знак, когда вы только помещаете значения в структуру.- И не используйте подстановочный знак, когда вы оба хотите получить и поместить из / в структуру.
Исключения:
Вы не можете поместить что-либо в тип, объявленный с
extends
подстановочный знак, кроме значенияnull
, который принадлежит каждому ссылочному типу.Вы не можете получить ничего из типа, объявленного с
super
подстановочный знак, кроме значения типаObject
, который является супертипом каждого ссылочного типа.
Может ли кто-нибудь помочь мне изучить это правило на глубине? Если возможно, пожалуйста, поставьте их иерархически.
1 ответ
Рассмотрим гроздь бананов. Это Collection<? extends Fruit>
в том смысле, что это коллекция определенного вида фруктов - но вы не знаете (из этой декларации), какого рода фрукты это коллекция. Вы можете получить предмет из него и знать, что это определенно будет фрукт, но вы не можете добавить к нему - вы можете пытаться добавить яблоко к банану, что, безусловно, будет неправильно. Вы можете добавить null
к этому, поскольку это будет действительной ценностью для любого вида фруктов.
Теперь рассмотрим фруктовую тарелку. Это Collection<? super Banana>
в том, что это коллекция какого-то типа "больше чем" Banana
(например, Collection<Fruit>
или же Collection<TropicalFruit>
). Вы, безусловно, можете добавить к этому банан, но если вы возьмете какой-то предмет из чаши, вы не знаете, что получите, - это может быть не банан. Все, что вы точно знаете, это то, что он будет действительным (возможно, null
) Object
ссылка.
(В общем, для вопросов об обобщениях Java, FAQ по обобщению Java является отличным ресурсом, который содержит ответы практически на все вопросы, связанные с обобщениями, которые вы, вероятно, к нему добавите.)