在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