一、List<? extends T>
创建空类Animal
public class Animal{
}
dog继承Animal
public class Dog extends Animal{
}
创建测试类添加后发现编译出错
public class TypeTest {
public static void main(String[] args) {
ArrayList<? extends Animal> animals = new ArrayList<>();
Dog dog=new Dog();
animals.add(dog);//编译出错
ArrayList<Dog> dogs = new ArrayList<>();
dogs.add(dog);
animals=dogs;//没有问题
}
}
结论:
<? extends Animal> 这种list 只允许赋值 不允许 add
原因:
- 已知Dog extends Animal
假设Cat extends Animal
通过泛型可知 List 类型为List<Dog> 或 List<Cat> 或 List<Animal>
但是编译器不清楚
如果为List<Cat> 添加 List<Dog> 就会出错
二、List<? super T>
在上述基础上创建类
public class ParentAnimal {
}
修改Animal
public class Animal extends ParentAnimal{
}
public class TypeTest {
public static void main(String[] args) {
ArrayList<? super Animal> animals = new ArrayList<>();
Dog dog=new Dog();
animals.add(dog);
ParentAnimal parentAnimal=new ParentAnimal();
animals.add(parentAnimal);//编译出错
ArrayList<ParentAnimal> parentAnimals=new ArrayList<>();
parentAnimals.add(parentAnimal);
animals=parentAnimals;//编译正常
}
}
结论:
通过代码可知添加Animal子类是没有问题的,但是添加父类却有问题,但是赋值给List是没有问题的
原因:
- <? super animal>List 类型一定为 List<Animal> 及 List<ParentAnimal> 等(有可能有Animal的继承关系有多层 比如 ParentAnimal 又继承了 XXX)
- 为什么添加子类没问题?多态。因为编译器确定你的最下层一定为Animal所以继承Animal的类添加不会编译出错
- 为什么添加父类有问题? 同 <? extends Animal >
但取出时类型为object (编译器并不清楚你的超类有哪些,而Object是所有类的超类)