1、supser:表明容器元素类型是super关键字后面的类或父类
List<? super Sub> list = new ArrayList<Super>();
list.add(new Sub());//可以
list.add(new SubSub());//可以
list.add(new Super());//编译错误,由于无法确定具体的父类,导致不能向其中添加任何具体的父类
Sub sub = list.get(0);//编译错误,由于无法确定具体的父类,导致不能转换成具体的父类
Object obj = list.get(0);//可以
2、extends:表明容器元素类型是extends关键字后面的类或子类
List<? extends Super> list = new ArrayList<Super>();
Super s = list.get(0);//可以
list.add(new Super());//编译错误,由于无法确定具体的子类,导致不能向其中添加任何具体的子类
总结:PECS原则(Producer Extends,Consumer Super)
如果要从集合中读取类型T的数据,并且不能写入,可以使用 ? extends 通配符;(Producer extends)
如果要从集合中写入类型T的数据,并且不需要读取,可以使用 ? super 通配符;(Consumer super)
如果既要存又要取,那么就不要使用任何通配符。