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

PECS原则

PECS原则的全拼是"Producer Extends Consumer Super"。

当需要频繁取值,而不需要写值则使用" ? extends T "作为数据结构泛型。相反,当需要频繁写值,而不需要取值则使用" ? super T "作为数据结构泛型。

使用示例

创建Apple,Fruit两个类,其中Apple是Fruit的子类,写如下测试代码:

public class PECS {

ArrayList extends Fruit> exdentFurit;

ArrayList super Fruit> superFurit;

Apple apple = new Apple();

private void test() {

Fruit a1 = exdentFurit.get(0);

Fruit a2 = superFurit.get(0); //Err1

exdentFurit.add(apple); //Err2

superFurit.add(apple);

}

}

其中Err1和Err2行处报错,因为这些操作并不符合PECS原则,逐一分析:

Err1

对于使用" ? super T "规定泛型的数据结构,我们只知道其存储的值是T的父类,若以T为数据类型取值时 T t = ?,等于将父类(?)当做子类(T)使用,这显然是不合理的,父类缺少子类中的一些信息,因此编译器直接禁止在使用" ? super T "泛型的数据结构中进行取值,只能进行写值,正是开头所说的CS原则。

Err2

使用" ? extends T "规定泛型的数据结构,我们知道其存储的值是T的子类,T可以有多个不同表现的子类(多态),因此当我们进行写值时,我们并不知道其中存储的到底是哪个子类,不同子类是不同的类型,因此写值操作必然会出现问题,所以编译器接禁止在使用" ? extends T "泛型的数据结构中进行写,只能进行取值,正是开头所说的PE原则。

总结

PECS原则,就是当时用extends做泛型时,该数据结构作为Producer对外提供值,只能进行取值而不能写值。

当时用super做泛型时,该数据结构作为Producer对外提供值,只能进行取值而不能写值。 Consumer Super

文章内容为个人理解,如有错误欢迎指出。

java pecs_『Java』泛型中的PECS原则相关推荐

  1. Java泛型中的PECS原则

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

  2. pecs_Java泛型中的PECS原则

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

  3. Java 泛型中的PECS原则

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

  4. Java 泛型中的 PECS 原则

    PECS 即 producer extends, Consumer super 如果想要获取, 那么推荐使用 ? extends T 如果想要存放, 那么推荐使用 ? super T @Testpub ...

  5. Java编程的逻辑 (36) - 泛型 (中) - 解析通配符

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  6. java super extend 区别_Java泛型中extends和super的区别

    extends T>和 super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. extends T&g ...

  7. dotnetty java netty,『神坑』DotNetty 内存泄漏 解决办法

    背景 近来在用 DotNetty 实现一个文件上传下载的同步服务. 其中:客户端下载服务端的文件,客户端多次请求,从服务端将文件分片下载下来,追加到本地磁盘. -- 非常简单的代码,都写了几十次了,驾 ...

  8. 『JavaSE』泛型和包装类

    本篇博客主要介绍Java泛型相关的知识和包装类的相关知识的简单认识. 泛型 Java中的泛型和C++的泛型大概是相似的: Java泛型参数只可以代表类,不能代表个别对象: Java编译器在编译泛型时会 ...

  9. 『TypeScript』泛型

    泛型(Generics)是允许同一个函数接受不同类型参数的一种模板.相比于使用 any 类型,使用泛型来创建可复用的组件要更好,因为泛型会保留参数类型. T 代表Type,在定义泛型是通常用作第一个类 ...

最新文章

  1. iconfont svg图标不能更改颜色的解决方法
  2. 《梦断代码》读后笔记_2
  3. 判断两条链表是否交叉,若有交叉,返回交叉节点的指针。
  4. 和平精英现在服务器暂时未开放,和平精英为什么登陆不进去 和平精英服务器分批登陆是什么意思...
  5. Linux内核 eBPF:Hacking Linux USDT with Ftrace
  6. 《深入应用C++11:代码优化与工程级应用》勘误表
  7. python安装详细步骤windows10_Windows10系统安装Python教程
  8. 多显示器 坐标 左上角_也许是你的第一台专业显示器,隶属华硕ProArt创意国度的PA248QV...
  9. 【word论文排版教程3】制作样式和列表
  10. npn三种波形失真_RF测试笔记:三阶交调失真概述及测试
  11. ltspice滑动变阻器在哪_NB物理创新课堂|变阻器
  12. 中国首档「程序员真人秀」综艺登上热搜,燃炸了!
  13. 警告warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
  14. 生物计算机 量子计算机,光子计算机、生物计算机和量子计算机
  15. C语言实现函数确定最大最小值
  16. Latex语法学习10:盒子的使用(fbox, tcolorbox, boitee),支持设置颜色和换页
  17. 【C++】set/multiset/map/multimap
  18. 02 资源搜索-全面、快速查找全网你想要的任何信息、情报
  19. android程序安装目录在哪里,Android app 安装目录知识
  20. 4.0 ipu_soc,ipu_channel_t ,ipu_channel_params_t结构体详解

热门文章

  1. matlab中的imshow函数使用
  2. codeforces Round 314 div.2
  3. oracle报错ORA-01722无效数字处理
  4. qemu AIO线程模型
  5. 通过子节点查找父节点
  6. 图像处理_Ostu算法(大律法、最大类间方差法)
  7. numpy -- 基础方法操作 array和asarray数据类型常用基础方法
  8. js获取滚动条距离浏览器顶部,底部的高度
  9. git之本地有未提交代码如何切换分支
  10. SQL约束之外键约束