1.通配符
泛型通配符有两种
上界通配符<? extends xx>
下界通配符<? super xx>
2.举例说明
先上代码吧
class A{
}
class B extends A{
}
class C extends A{
}
public class NonCovariantGenerics {
public static void main(String[] args) {
List<? extends A> list1= new ArrayList<B>();
List<? super B> list2= new ArrayList<B>();
//list1.add(new B()); 编译出错
list2.add(new B());
}
public static <T> void f1(List<T> list,T item) {
list.add(item);
}
}
结构很简单的类,B和C都继承基类A.
<? extends A>的意思表示某一个类,这个类是继承自A,确定了上界,但是问题就来了,继承A的类有B和C,编译器无法确定具体的子类型,所以编译出错.
<? super B>表示某一个类,这个类是B的父类(超类),确定了下界,也就是说,<? super B>表示B,A以及B的其他父类(java只有单继承,这里只是举例),虽然不确定是具体的哪一个父类,但是<? super B> 包含了B,所以编译不出错.
3.总结
读取用 extends
写入用super
(拓展)PESC 原则(Producer Extends Consumer Super)