读了O’Reilly的书,因为我了解了这一计算原理。
extends
super
当你都想从一个结构中获取和放置一个结构时,请不要使用通配符。 例外情况是:
extends除了值null(属于每个引用类型)之外,你不能将任何东西放入用通配符声明的类型中。
你不能从用super通配符声明的类型中获取任何东西,除了type的值Object是每个引用类型的超类型。
Object
谁能帮助我深入探索这个规则?如果可能的话,请把它们分层。
考虑一堆香蕉。这是Collection<? extends Fruit>因为它是一种特定种类的水果的集合-但是你(从该声明中)不知道它是哪种水果的集合。你可以从中获得一个项目,并且知道它肯定是水果,但是你不能添加它-你可能正在尝试向一堆香蕉中添加一个苹果,这肯定是错误的。你可以添加null它,因为这对于任何种类的水果都是有效值。
Collection<? extends Fruit>
现在考虑一个水果碗。这是一个Collection<? super Banana>,因为它是某种类型“大于”的集合Banana(例如Collection<Fruit>或Collection<TropicalFruit>)。你绝对可以在其中添加一个香蕉,但是如果你从碗中取出一个物品,你将不知道会得到什么-它很可能不是香蕉。你唯一可以确定的是,它将是一个有效的(可能是null)Object参考。
Collection<? super Banana>
Collection<Fruit>
Collection<TropicalFruit>
(通常,对于Java泛型问题,Java泛型FAQ是一个很好的资源,其中包含你可能会提出的几乎所有与泛型相关的答案。)