对于<? extends T>和<? super T>的通俗理解

73 阅读1分钟
class BigAnimal{}
class Animal extends BigAnimal{}
class Dog extends Animal{}
class BigDog extends Dog{}
  1. : 表示上界限定符,?代表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 类型时不能存入数据,类型会不确定,
//只能取数据,类型能唯一确定。
  1. :表示下界限定符,?代表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>类型时不能取数据,类型会不确定。因为不知道你这个代表的是哪个父类,无法遍历