取得原则的解释
我读过O'Reilly的书,在那里我了解了这个获得原则 。
- 只有当结构中有值时才使用
extends通配符。- 只将值放入结构中时使用
super通配符。- 当你们想要从一个结构中获取和放入时,不要使用通配符。
例外是:
除了值为
null(属于每个引用types)之外,不能将任何内容放入使用extends通配符声明的types中。
除了
Objecttypes的值(这是每个引用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有关的东西的答案,您可能会抛弃它。)