Java 泛型之 extends 与 super

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)
如果既要存又要取,那么就不要使用任何通配符。

猜你喜欢

转载自www.cnblogs.com/qwdong/p/11249635.html