获取原则的解释

时间:2009-08-18 06:22:09

标签: java generics

我读过O'Reilly的书,因为我开始知道 获取原则

  
      
  • 当您获取结构中的值时,请使用 extends 通配符。
  •   
  • 当您值添加到结构中时,请使用 super 通配符。
  •   
  • 当你们想要从一个结构中获取和放置时,不要使用通配符。
  •   

例外是:

  
      
  • 您不能将任何内容放入使用 extends 通配符声明的类型中,但值 null 除外参考类型。

  •   
  • 您无法从使用 super 通配符声明的类型中获取任何内容,但 Object 类型的值除外是每种参考类型的超类型。

  •   

任何人都可以帮助我深入探索这条规则吗?如果可能的话,请按层次方式进行。

1 个答案:

答案 0 :(得分:147)

考虑一堆香蕉。这是Collection<? extends Fruit>,因为它是一种特殊水果的集合 - 但你不知道(来自那个宣言)它是什么样的水果。你可以获取一个项目并知道它肯定会成为一个水果,但你不能添加 - 你可能会尝试将一个苹果添加到一堆香蕉,肯定是错的。您可以向其添加null,因为这将是任何种水果的有效值。

现在考虑一个水果碗。这是Collection<? super Banana>,因为它是某个类型“大于”Banana的集合(例如,Collection<Fruit>Collection<TropicalFruit>)。你可以肯定为此添加一个香蕉,但如果你从碗里取一个项目,你不知道你会得到什么 - 它可能是一个香蕉。所有你知道的是它将是一个有效的(可能nullObject参考。

(一般来说,对于Java泛型问题,Java Generics FAQ是一个很好的资源,其中包含几乎所有与泛型相关的答案,你可能会把它扔到它。)