【发布时间】:2011-11-12 17:54:51
【问题描述】:
在 java generic 中,我理解通配符、super 和 extends 的含义,但不明白为什么不允许我添加任何内容,以及为什么允许我在层次结构中添加到 SomeType,但在层次结构?
class Animal {}
class Cat extends Animal{}
以下方法可以获取动物列表或动物子的列表,即猫,但没有别的 而且我不允许添加任何东西,如果尝试添加,编译器会阻止我为什么?
void addAminal(List<? extends Aminal> aList){
aList.add(new Cat()); // compiler error
aList.add(new Animal()); // compiler error
}
现在下面的方法可以接受任何动物列表或任何超类型动物,但没有动物的子类型,并且我可以将对象添加到动物或层次结构更低的对象,所以当我尝试添加对象时,编译器会抱怨为什么?
void addAnimal(List<? super Animal> aList){
aList.add(new Animal()); // no error
aList.add(new Cat()); // no error
aList.add(new Object()); // compiler error why ?
}
谢谢 艾莉亚
【问题讨论】:
-
我建议你看看Java Generics Guide和其他关于covariance and contravariance的问题。
-
我不得不承认这是一篇枯燥的文章,但@dm3 链接的关于 Java 泛型的 PDF 包含有价值的信息。它面向那些了解 Java 基础但不太掌握泛型的人。换句话说,从这个问题来看,它是为你写的,Bharat! :-)