class BigAnimal{}
class Animal extends BigAnimal{}
class Dog extends Animal{}
class BigDog extends Dog{}
- : 表示上界限定符,?代表T的子类
public static void main(String[] args) {
List<Animal> animals = new ArrayList<>();
List<Dog> dogs = new ArrayList<>();
//上面的animals和dogs可以传入,不会报错,
//因为List的类型是确定的,可以传入Animal类和它的子类,但是不能传入Animal的超类
d(animals);
}
public static void d(List<? extends Animal> animals) {
//这里会报错,原因是如果这里你添加了Dog,后面又再添加BigDog,
//类型就会不确定,所以编译器为了保护安全性,强制不能存入。
animals.add(new Dog());
}
//所以总结来说,?extends T 类型时不能存入数据,类型会不确定,
//只能取数据,类型能唯一确定。
- :表示下界限定符,?代表T的父类
//d中存的都是Animal的父类,这个是确定的,所以可以添加Animal的子类,
//Animal a = new Dog() 多态体现
List<? super Animal> d = new ArrayList<>();
d.add(new Dog());
d.add(new BigDog());
//这里会报错,只能添加Animal以及子类
d.add(new BigAnimal());
//遍历会报错,不知道该以谁来定义:Animal animal是不对的,具体类型不知道是哪个
//父类
for (Animal animal : d) {
}
//所以总结来说,<? super T>类型时不能取数据,类型会不确定。因为不知道你这个代表的是哪个父类,无法遍历