了解泛型集合行为

时间:2017-05-20 02:08:09

标签: java generics

当试图更好地理解泛型时,我创建了两个具有不同边界的集合。请注意,我不会在这里粘贴类定义,因为它们是不言自明的。另外,为了简单起见,一切都是一个类(这里没有接口)。

List<? super Fruit> list1 = new ArrayList<>();
List<? extends Fruit> list2 = new ArrayList<>();

我的理解是,list1被宣布为通用水果容器。因此,它能够容纳任何种类的水果,这与宣布List<Fruit>基本相同。我能够通过以下方式验证行为:

list1.add(new Apple());
list1.add(new Orange());
list1.add(new Fruit());

然而,我正在努力理解这个上限版本,即:

List<? extends Fruit> list2 = new ArrayList<>();

当我尝试将项目添加到列表中时,编译器会发出错误:

list2.add(new Fruit()); // error
list2.add(new Apple()); // error
list2.add(new Object());// error

我得到的错误是:

add(capture<? extends Fruit> in List cannot be applied to (Apple)

真正有趣的是,以下工作正常:

List<Juicer<? extends Fruit>> fruitJuicers = new ArrayList<>();
Juicer<Fruit> fruitJuicer = new Juicer<>();
Juicer<Apple> appleJuicer = new Juicer<>();

fruitJuicers.add(fruitJuicer);
fruitJuicers.add(appleJuicer);

如果有人能帮我理解背后的原因,我将不胜感激。

0 个答案:

没有答案