一、通配符的上界
“?”就是通配符,而“? extends Animal”则表示通配符“?”的上界为Animal, 换句话说就是,“? extends Animal”可以代表Animal或其子类, 可代表不了Animal的父类(如Object),因为通配符的上界是Animal。
使用泛型的原因:List<Cat>并不是List <Anilmal> 的子类型;
public void act(List<? extends Animal> list){
// list.add(new Animal()); 编译错误,真实类型可能是Animal中一个子类
// list.add(new Cat()); 错误
list.add(null); //仅可以添加(add)null
}
public void testExtendAnimal(){
Animal animal = new Animal();
Cat cat = new Cat();
ArrayList<Animal> animallist = new ArrayList<>();
animallist.add(animal);
animallist.add(cat);
ArrayList<Cat> catlist = new ArrayList<>();
//catlist.add(animal); 报错
catlist.add(cat);
act(animallist);
act(catlist); //入参可以是Animal的子类
}
二、通配符的下界
既然有了通配符的上界,自然有着通配符的下界。可以如此定义通配符的下界 List<? super Bird>,其中”Bird“就是通配符的下界。注意:不能同时声明泛型通配符申明上界和下界.
三、无界通配符
知道了通配符的上界和下界,其实也等同于知道了无界通配符,不加任何修饰即可,单独一个“?”。如List<?>,“?”可以代表任意类型,“任意”也就是未知类型。
ArrayList<Cat> catlist = new ArrayList<>();
List<Object> list = catlist; //报错
List<?> list1 = catlist;