我读过O'Reilly的书,因为我开始知道 获取原则 。
- 当您获取结构中的值时,请使用
extends
通配符。- 当您将值添加到结构中时,请使用
super
通配符。- 当你们想要从一个结构中获取和放置时,不要使用通配符。
例外是:
您不能将任何内容放入使用
extends
通配符声明的类型中,但值null
除外参考类型。您无法从使用
super
通配符声明的类型中获取任何内容,但Object
类型的值除外是每种参考类型的超类型。
任何人都可以帮助我深入探索这条规则吗?如果可能的话,请按层次方式进行。
答案 0 :(得分:147)
考虑一堆香蕉。这是Collection<? extends Fruit>
,因为它是一种特殊水果的集合 - 但你不知道(来自那个宣言)它是什么样的水果。你可以获取一个项目并知道它肯定会成为一个水果,但你不能添加 - 你可能会尝试将一个苹果添加到一堆香蕉,肯定是错的。您可以向其添加null
,因为这将是任何种水果的有效值。
现在考虑一个水果碗。这是Collection<? super Banana>
,因为它是某个类型“大于”Banana
的集合(例如,Collection<Fruit>
或Collection<TropicalFruit>
)。你可以肯定为此添加一个香蕉,但如果你从碗里取一个项目,你不知道你会得到什么 - 它可能不是一个香蕉。所有你知道的是它将是一个有效的(可能null
)Object
参考。
(一般来说,对于Java泛型问题,Java Generics FAQ是一个很好的资源,其中包含几乎所有与泛型相关的答案,你可能会把它扔到它。)