考虑一堆香蕉。这是Collection<? extends Fruit>
因为它是一种特定种类的水果的集合-但是你(从该声明中)不知道它是哪种水果的集合。你可以从中获得一个项目,并且知道它肯定是水果,但是你不能添加它-你可能正在尝试向一堆香蕉中添加一个苹果,这肯定是错误的。你可以添加null它,因为这对于任何种类的水果都是有效值。
现在考虑一个水果碗。这是一个Collection<? super Banana>
,因为它是某种类型“大于”的集合Banana(例如Collection<Fruit>
或Collection<TropicalFruit>
)。你绝对可以在其中添加一个香蕉,但是如果你从碗中取出一个物品,你将不知道会得到什么-它很可能不是香蕉。你唯一可以确定的是,它将是一个有效的(可能是null)Object参考。
(通常,对于Java泛型问题,Java泛型FAQ是一个很好的资源,其中包含你可能会提出的几乎所有与泛型相关的答案。)