Вопрос-ответ

Explanation of the get-put principle

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

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



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

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

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


Исключениями являются:



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


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



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

Переведено автоматически
Ответ 1

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

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

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

java generics