https://segmentfault.com/a/1190000017509439

JAVA的PECS原则

PECS指“Producer Extends,Consumer Super”

比如:

List extends Fruit> fruitList = new ArrayList<>();

fruitList.add(new Apple());

fruitList.add(new Orange());

但是编译器却报了编译错误:

按理说fruitList是一个持有类型为Fruit及其子类的泛型列表啊,为什么不能往其中添加Fruit的子类呢?

因为泛型的一大好处就是可以在编译时检查,避免传入不相符的类型可能导致的ClassCastException了。但是声明fruitList的时候没有明确的指定泛型的具体类型,所以编译器无法确认其持有的具体类型,当然也就拒绝了add操作。

fruitList只是规定了泛型的上限,但是并没有确定具体的类型,也无法确定具体的子类型,可以是Apple,Orange还可能是Banana,所以不能把具体的对象添加进去,不然使用的时候可能导致ClassCastException了。但是可以保证从里面取出来的数据都是Fruit及其子类,而且还是Fruit的某一个子类。

我们把代码改成下面这样子就可以添加不同的Fruit对象了。

因为我们规定了fruitList持有的都是Fruit及其父类,可以将Fruit 及其子类都添加进去

List super Fruit> fruitList = new ArrayList<>();

fruitList.add(new Apple());

fruitList.add(new Orange());

但是

fruitList.add(new Object());

却不行,why?因为在编译时无法确认具体的fruitList持有的是Fruit的哪一个父类,要想确定就必须指定具体泛型类了。所以就无法往里面写入Fruit的父类型对象。

所以我们可以从Java Collctions copy方法的签名可以看出

public static  void copy(List super T> dest, List extends T> src) {

dest集合持有?super T ,可以往里面写入所有T及其子类对象,而src集合持有? extends T泛型。可以确保的是从里面读取的数据都是T及其子类。所以可以写入dest了。

PS:Java 类的final方法和static不能复写

Reference

标签:PECS,JAVA,原则,子类,Fruit,add,fruitList,泛型,new

来源: https://blog.csdn.net/qq_15037231/article/details/99997543

java pecs_JAVA的PECS原则相关推荐

  1. Java泛型之PECS原则

    转载自: [Java]泛型中 extends 和 super 的区别? Java泛型详解 文章目录 通配符 上下界通配符的副作用 上界<? extends T>不能往里存,只能往外取 下界 ...

  2. java pecs_Java泛型PECS

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

  3. java pecs_Java 泛型 PECS

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

  4. Java泛型的PECS原则

    1.什么是PESC ? PESC  = producer-extens , consumer -super. 如果参数化类型表示一个 T 生产者,就使用 <? extends T>: 如果 ...

  5. Java泛型中的PECS原则

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

  6. Java集合泛型作为参数时,使用中的一些问题。包括但不限于PECS原则

    目录 泛型中的PECS原则以及使用注意 一.泛型中的型变(协变.逆变.不可变) 1. 什么是型变 2. 什么是协变(Covariance) 3. 什么是逆变(Contravariance) 4. 不可 ...

  7. pecs_Java泛型中的PECS原则

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

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

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

  9. Java 泛型中的PECS原则

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

最新文章

  1. linux xampp eclipse xdebug 无法进入断点
  2. XSZD00982 流向屏闭
  3. java表单自动绑定数据_java工作流系统表单自动 获取数据
  4. 区块链BaaS云服务(16)天德链TDBC“智能合约”
  5. pwn入门-PLT表与GOT表、libc入门
  6. 宁夏计算机专科大学排名,2019年民办学校排行榜_科普2019年宁夏专科学校排名及2019宁夏民办高校排...
  7. boost::gil::compute_harris_responses用法的测试程序
  8. JS开源框架Stimulus:让web应用在移动端达到原生体验!
  9. centos6.4修改网卡名
  10. JAVA秒杀mysql层实现_Java商城高并发秒杀系统架构分析设计与开发实战
  11. Windows Terminal 完全配置教程(主题以及启动设置)
  12. python训练模型测试模型_python 机器学习中模型评估和调参
  13. Hibernate命名查询示例 - @NamedQuery
  14. 基于机器视觉的滑块检测
  15. 如何在 Mac 上使用剪贴板?
  16. NPOI Word 多级标题结构设置
  17. Markdown编辑器:好看的字体颜色和各种表情符号
  18. Adobe Photoshop裁剪和拉直照片改善构图
  19. 微信小程序后台销毁时间 演变和总结(热启动时间限制)
  20. 学习笔记——共阳数码管的静态显示

热门文章

  1. C语言文件操作函数详解
  2. 代码炼金术9 项目修炼4 判断力
  3. [react] React项目中使用阿里font-icon的svg形式
  4. 全程配图超清晰的JAVA后台控制(maven+Tomcat+JDBC)第二期
  5. ❀工信工实验参考——《大物10.4迈克尔逊的干涉仪》
  6. 取消win10睡眠后不需要密码就能打开电脑的方法
  7. java执行linux跳板机_java Jsch实现跳板机操作远程数据库
  8. 怎样设置CRM目标?有什么作用?
  9. 分析个人建议-网站获得快速排名
  10. Ubuntu:查看内存占用情况