在java通用中,我明白通配符是什么,超级和扩展,但没有得到为什么不允许我添加任何东西,为什么允许我在层次结构中添加upto SomeType,但不在层次结构中?java泛型和通配符
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泛型指南](http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf)和其他有关[协变和反变化](http ://stackoverflow.com/questions/2501023/demonstrate-covariance-and-contravariance-in-java)。 – dm3
我不得不承认这是一个干读,但@ dm3链接的Java泛型的PDF有宝贵的信息。它面向那些了解Java基础知识但不太了解泛型的人。换句话说,从这个问题来看,它是为你写的,巴拉特! :-) – corsiKa
参考这里 - http://stackoverflow.com/questions/4343202/difference-between-super-t-and-extends-t-in-java – IsAs