什么是

下面是一个简单的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,想要灵活的处理Integer,Long等Number的子类型的集合

Stack numberStack = new Stack();

Iterable integers = ....;

numberStack.pushAll(integers);

此时

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

public void pushAll(Iterable extends E> 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和Collection对象:

Stack numberStack = new Stack();

Collection objects = ...;

numberStack.popAll(objects);

同样上面这段

总结:

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

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

pecs_Java 泛型: 什么是PECS - 穿梭于偶然相关推荐

  1. java pecs_Java 泛型: 什么是PECS(Producer Extends, Consumer Super)

    什么是PECS? PECS指"Producer Extends,Consumer Super".换句话说,如果参数化类型表示一个生产者,就使用:如果它表示一个消费者,就使用,可能你 ...

  2. pecs_Java泛型中的PECS原则

    今天在写代码的时候使用到了这样一个方法签名:public void foo(Map map); 在写这个参数的时候正好在想一些关于泛型的东西,于是:public void foo(Map extend ...

  3. java pecs_Java 泛型 PECS

    在stackoverflow上看到两篇关于java泛型 PECS 的问答: PECS Remember PECS:"Producer Extends,Consumer Super" ...

  4. pecs_java泛型-PECS

    1 packagecom.example.base;2 3 importjava.util.ArrayList;4 importjava.util.List;5 6 importcom.example ...

  5. java pecs_Java泛型PECS

    我知道PECS是什么意思. 制作人扩展,消费者超级. 问题是我怎么知道它是消费者还是生产者? 此代码也遵循"PECS" public class Tree { //List of ...

  6. Java泛型中的PECS原则

    今天在写代码的时候使用到了这样一个方法签名: public void foo(Map<String, String> map); 在写这个参数的时候正好在想一些关于泛型的东西,于是: pu ...

  7. java pecs_『Java』泛型中的PECS原则

    Java编程中有时我们要用到不确定的元素,通常用通配符"?"表示,其中" ? extends T "叫"上界通配符", " ? s ...

  8. Java 泛型中的PECS原则

    在泛型编程时,使用部分限定的形参时,<? super T>和<? extends T>的使用场景容易混淆,PECS原则可以帮助我们很好记住它们: 生产者(Producer)使用 ...

  9. 泛型通配符之PECS

    目录 基础知识点 上限通配符 List中上限通配符的add()方法 List中上限通配符的get()方法 下限通配符 List中下限通配符的add()方法 List中下限通配符的get()方法 基础知 ...

最新文章

  1. 4000字,详解 Python 操作 MySQL 数据库!
  2. Python3.5源码分析-sys模块及site模块导入
  3. 十大编程算法助程序员走上高手之路
  4. 一篇RxJava友好的文章(一)
  5. OpenCASCADE可视化:应用交互服务之本地选择
  6. 上传文件返回数据提示下载
  7. cmake 找不到 macros_愿我们在彼此看不到的岁月里熠熠生辉
  8. rocket mq 监听端口_浅谈业务流程中的mq使用方式
  9. viewcube翻译_view cube是什么意思
  10. jfinal html页面在多个路径,jfinal不能正确加载html网页,总是报错的解决方法
  11. 1.5.2 编译java程序
  12. 文件名lin.php是什么,宝塔面板-PHP服务添加‘扩展名=ixed.5.4.lin
  13. 可持久化线段树(主席树)总结及板子
  14. 科研论文中的图片如何保证高清
  15. 厦大C语言上机1381
  16. 前端寒假css(100-181)
  17. 特征选择 - 逐步回归 (stepwise regression)
  18. Eslint 从入门到放弃
  19. python类中的__dict__
  20. linux必学的100个命令,Linux必学的60个命令

热门文章

  1. 纯净版win7旗舰版真
  2. OpenCV中的imshow函数深度剖析
  3. Franka Emika新款机器人FP3震撼发布,带来全新生态,重新定义协作机器人
  4. 第一章 第一节:Python基础_认识Python
  5. konva文字大小自适应容器宽度
  6. Windows安装docker,和配置镜像加速地址
  7. python ostu代码
  8. (翻译)日期选择器(Calendar Picker)
  9. 基于opencascade与osg的CAD探索之osg拾取点线面
  10. redis第九课-击穿,穿透,雪崩,redis作为分布式锁的可行性