取得原则的解释

我读过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> )。 你一定可以加一根香蕉,但是如果你从碗里拿一个东西,你不知道会得到什么 – 这可能不是香蕉。 所有你知道的是,它将是一个有效的(可能为nullObject引用。

(一般来说,对于Javagenerics的问题, Javagenerics常见问题解答是一个很好的资源,其中包含了几乎所有与generics有关的东西的答案,您可能会抛弃它。)