博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 泛型: 什么是PECS(Producer Extends, Consumer Super)
阅读量:6226 次
发布时间:2019-06-21

本文共 1683 字,大约阅读时间需要 5 分钟。

hot3.png

什么是PECS?

PECS指“Producer Extends,Consumer Super”。换句话说,如果参数化类型表示一个生产者,就使用;如果它表示一个消费者,就使用,可能你还不明白,不过没关系,接着往下看好了。


下面是一个简单的Stack的API接口:

public class  Stack
{ public Stack(); public void push(E e): public E pop(); public boolean isEmpty();}

假设想增加一个方法,按顺序将一系列元素全部放入Stack中,你可能想到的实现方式如下:

public void pushAll(Iterable
src){ for(E e : src) push(e)}

假设有个Stack<Number>,想要灵活的处理Integer,Long等Number的子类型的集合

Stack
numberStack = new Stack
();Iterable
integers = ....;numberStack.pushAll(integers);

此时代码编译无法通过,因为对于类型Number和Integer来说,虽然后者是Number的子类,但是对于任意Number集合(如List<Number>)不是Integer集合(如List<Integer>)的超类,因为泛型是不可变的。

幸好java提供了一种叫有限通配符的参数化类型,pushAll参数替换为“E的某个子类型的Iterable接口”:

public void pushAll(Iterable
src){ for (E e: src) push(e);}

这样就可以正确编译了,这里的<? extends E>就是所谓的 producer-extends。这里的Iterable就是生产者,要使用<? extends E>。因为Iterable<? extends E>可以容纳任何E的子类。在执行操作时,可迭代对象的每个元素都可以当作是E来操作。

与之对应的是:假设有一个方法popAll()方法,从Stack集合中弹出每个元素,添加到指定集合中去。

public void popAll(Collection
dst){ if(!isEmpty()){ dst.add(pop()); }}

假设有一个Stack<Number>和Collection<Object>对象:

Stack
numberStack = new Stack
();Collection
objects = ...;numberStack.popAll(objects);

同样上面这段代码也无法通过,解决的办法就是使用Collection<? super E>。这里的objects是消费者,因为是添加元素到objects集合中去。使用Collection<? super E>后,无论objects是什么类型的集合,满足一点的是他是E的超类,所以不管这个参数化类型具体是什么类型都能将E装进objects集合中去。

总结:

如果你是想遍历collection,并对每一项元素操作时,此时这个集合时生产者(生产元素),应该使用 Collection<? extends Thing>.

如果你是想添加元素到collection中去,那么此时集合时消费者(消费元素)应该使用Collection<? super Thing>.

转载于:https://my.oschina.net/u/563488/blog/1933745

你可能感兴趣的文章
11.时间序列分析狠
查看>>
Java之Annotation
查看>>
汇编语言中整数常量表示方式
查看>>
XML Schema choice 元素
查看>>
【Luogu 3810】三维偏序
查看>>
hdu Hike on a Graph
查看>>
深入分析 ThreadLocal 内存泄漏问题
查看>>
[HNOI2017]礼物
查看>>
[转]推荐一些不错的计算机书籍
查看>>
linux命令(30):tail
查看>>
有关windows dpi适配(c#)
查看>>
SoupUI的使用
查看>>
Nlog的简单使用
查看>>
JQuery中 数组与字符串(过滤,排序,拆分,合并)
查看>>
pycharm 设置
查看>>
js添加事件
查看>>
模式识别开发之项目---基于人头检测的人流量监测
查看>>
嵌入式开发之优化---代码优化
查看>>
题解 P1665 【正方形计数】
查看>>
python 字典 get方法
查看>>