通配符有三种:
1、无限定通配符 <?>
可以接受任何的实际类型作为泛型实参。
无界通配符<?>的输入唯一可接受的是可为所有类型的null。(因为<?>能接受任何的实际类型,但不确定到底是哪个实际类型。然而任何对象都可以接受null作为其值。所以输入只能接受null)
无界通配符的输出类型始终为Object(因为其意义为接受任何的实际类型作为泛参,而任何的实际类型都可以被转换为Object类型)
2、上边界限定通配符 < ? extends String>
可以接受其指定类型或其子类作为泛型实参
上边界限定通配符 < ? extends String> 的输入唯一可接受的是可为所有类型的null
上边界限定通配符 < ? extends String> 的输出类型为指定的类型
3、下边界限定通配符 < ? super String>
可以接受其指定类型或其父类作为泛型实参
下界通配符的输入类型为指定的类型或对应的子类类型
下边界限定通配符 < ? super String> 的输出类型始终为Object
举个例子:
class Person{
}
class Women extends Person{
}
class Student extends Women {
}
定义一个集合,设定泛型上边界,结果报错。
ArrayList<? extends Person> al =new ArrayList<>();
al.add(new Women()); //报错
al.add(new Person()); /报错
al.add(new Student()); //报错
因为上边界输入唯一可接受的时null。
改成下边界之后可以通过编译。因为下边界的输入类型为指定类型或对应的子类类型。
ArrayList<? super Person> al =new ArrayList<>();
al.add(new Women());
al.add(new Person());
al.add(new Student());
4.PECS原则: