Объяснение принципа 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 является отличным ресурсом, который содержит ответы практически на все вопросы, связанные с обобщениями, которые вы, вероятно, к нему добавите.)

Другие вопросы по тегам