取得原则的解释
我读过O'Reilly的书,在那里我了解了这个获得原则 。
- 只有当结构中有值时才使用
extends
通配符。- 只将值放入结构中时使用
super
通配符。- 当你们想要从一个结构中获取和放入时,不要使用通配符。
例外是:
除了值为
null
(属于每个引用types)之外,不能将任何内容放入使用extends
通配符声明的types中。除了
Object
types的值(这是每个引用types的超types)之外,您不能从使用super
通配符声明的types中获取任何内容。
任何人都可以帮助我深入探索这个规则吗? 如果可能的话,请把它们分层次的分开。
考虑一堆香蕉。 这是一个Collection<? extends Fruit>
Collection<? extends Fruit>
,因为它是一种特定种类的水果的集合 – 但是你不知道(从这个声明)它是一个集合什么样的水果。 你可以从中得到一个物品,知道它肯定是一个水果,但你不能添加到它 – 你可能会试图增加一个苹果一束香蕉,这肯定是错的。 您可以添加null
,因为这将是任何水果的有效值。
现在考虑一个水果篮。 这是一个Collection<? super Banana>
Collection<? super Banana>
,因为它是一种”大于“ Banana
Collection<Fruit>
(例如Collection<Fruit>
或Collection<TropicalFruit>
)。 你一定可以加一根香蕉,但是如果你从碗里拿一个东西,你不知道会得到什么 – 这可能不是香蕉。 所有你知道的是,它将是一个有效的(可能为null
) Object
引用。
(一般来说,对于Javagenerics的问题, Javagenerics常见问题解答是一个很好的资源,其中包含了几乎所有与generics有关的东西的答案,您可能会抛弃它。)