Java中<? super T>和List<? extends T>的区别

<? extends T>

下面通配符声明List<? extends Number> foo3的赋值式是合法的:

List<? extends Number> foo3 = new ArrayList<Number>();  // Number "extends" Number (in this context)
List<? extends Number> foo3 = new ArrayList<Integer>(); // Integer extends Number
List<? extends Number> foo3 = new ArrayList<Double>();  // Double extends Number
  1. - 上面给出可能的赋值式,你能确保从List foo3读取什么类型的对象?:

    • 你可以读取一个Number,因为任意包含一个Number或一个Number子类的列表都可赋值于foo3
    • 你不可读取一个Integer,因为foo3可以指List<Double>
    • 你不可读取一个Double,因为foo3可以指List<Integer>
  2. - 上面给出可能的赋值式,你能添加什么类型的对象至List foo3?:
    • 你不能添加一个Integer,因为foo3可以指List<Double>
    • 你不能添加一个Double,因为foo3可以指List<Integer>
    • 你不能添加一个Number,因为foo3可以指List<Integer>

你不能将任何对象添加到List<? extends T>是因为你不能保证它真正指向的是哪种类型的列表,因此,你不能保证某对象在该列表中是允许的。唯一的“确保”是你只能从中读取,你会得到一个T或者T的子类。

<? super T>

下面通配符声明List<? super Number> foo3的赋值式是合法的:

List<? super Integer> foo3 = new ArrayList<Integer>();  // Integer is a "superclass" of Integer (in this context)
List<? super Integer> foo3 = new ArrayList<Number>();   // Number is a superclass of Integer
List<? super Integer> foo3 = new ArrayList<Object>();   // Object is a superclass of Integer
  1. - 上面给出可能的赋值式,你能确保从List foo3读取什么类型的对象?:

    • 你不能确保读取一个Integer,因为foo3可以指List<Number>List<Object>
    • 你不能确保读取一个Number,因为foo3可以指List<Object>
    • 唯一能确定的是你能读取一个ObjectObject子类的对象(但是你不知道具体哪个子类)。
  2. - 上面给出可能的赋值式,你能添加什么类型的对象至List foo3?:
    • 你可以添加一个IntegerInteger的子类。
    • 你不能添加一个Number,因为foo3可以指List<Integer>
    • 你不能添加一个Object,因为foo3可以指List<Integer>

PECS

记住PECS: “Producer Extends, Consumer Super”

  • "Producer Extends" - 如果你需要一个List来生产T值(你想从列表读取T),你就用? extends T来声明它,如List<? extends Integer>。但是你不能够添加东西到列表中。
  • "Consumer Super" - 如果你需要一个List来消费T值(你想从列表写入T),你就用? super T来声明它,如List<? super Integer>。但是你能从列表读取什么类型对象是不能确定的。
  • 如果你要列表读写兼顾,你就不要任何通配符声明该列表,如List<Integer>

我的助记

  • PECS -> PE teacher taught me computer science.
  • extends du, super xie -> edsx -> 恶毒的思想

一个例子

public class Collections { public static <T> void copy(List<? super T> dest, List<? extends T> src) {for (int i = 0; i < src.size(); i++) dest.set(i, src.get(i)); }
}

关于该例更多说明。

参考资料

Difference between <? super T> and <? extends T> in Java

Java中<? super T>和List<? extends T>的区别相关推荐

  1. IO流 (五) ----- 对象数据的序列化与反序列化

    相关文章: <IO流 (一) ----- 基本概念和File类> <IO流 (二) ----- 文件流> <IO流 (三) ----- 字符流和字符缓冲流> < ...

  2. 菜鸟学习笔记:Java提升篇6(IO流2——数据类型处理流、打印流、随机流)

    菜鸟学习笔记:Java IO流2--其他流 字节数组输入输出流 数据类型处理流 基本数据类型 引用类型 打印流 System.in.System.out.System.err 随机流RandomAcc ...

  3. 菜鸟学习笔记:Java提升篇5(IO流1——IO流的概念、字节流、字符流、缓冲流、转换流)

    菜鸟学习笔记:Java IO流1--IO流的概念.字节流.字符流.缓冲流.转换流 IO流的原理及概念 节点流 字节流 文件读取 文件写出 文件拷贝 文件夹拷贝 字符流 文件读取 文件写出 处理流 缓冲 ...

  4. Java裁剪音乐,利用IO流

    ** Java裁剪音乐,利用IO流 ** 主方法 public static void main(String[] args) throws IOException {//输入流对象,路径要裁剪文件路 ...

  5. java流类图结构_java学习之IO流(学习之旅,一)

    个人在学习IO流的时候看到如下所示java 流类图结构的时候,我的感想是,这么多··处于蒙的状态. Java流类图结构 这么多,没有分类不好学,那我们就慢慢一口一口的吃,这样每天学习一点就好了,其实很 ...

  6. java字符流输出流_JAVA语言之IO流字符串输入输出流

    本文主要向大家介绍了JAVA语言之IO流字符串输入输出流,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 概述 StringReader 字符输入流 和CharArrayReader类 ...

  7. java 弹出另存为_java如何实现 io流传输过来的文件,提示另存为弹出窗口?

    java如何实现 io流传输过来的文件,提示另存为弹出窗口? mip版  关注:166  答案:6  悬赏:0 解决时间 2021-01-24 22:00 已解决 2021-01-24 11:06 最 ...

  8. JAVA-SE中:集合,IO流,文件与异常

    java.util.Collection java集合是存储对象的工具类,有两个常见子接口 Set: 不可重复集,重复元素不能放入集合两次以上, 顺序不定 List: 可重复集:ArrayList() ...

  9. java byte char io流_Java基础进阶 IO流之字节流

    1.IO流 1.1.概述 之前学习的File类它只能操作文件或文件夹,并不能去操作文件中的数据.真正保存数据的是文件,数据是在文件中.而File类它只是去对文件本身做操作,不能对文件中的数据进行操作. ...

  10. java io的异常_Java 异常与IO流

    一.异常 想想一下代码会发生什么? public static voidmain(String[] args) {int a = 10;int b = 0; System.out.println(a/ ...

最新文章

  1. 关于matlab向文件写入数据的方法——留着备用
  2. 面试:你了解中兴吗_HTTP简介:您需要了解的所有内容
  3. 在二分类问题中,准确率一直处于50%上下的解决方法
  4. 互斥锁、共享内存方式以及生产者消费者模型
  5. 十九、“文捷笔妙活如水,气定神闲稳若山。”(2021.6.7)
  6. pyspark.zip/pyspark/worker.py:53: UnicodeWarning: Unicode equal comparison failed to convert both ar
  7. Google首席决策师告诉你,AI和数据科学团队需要哪10种角色
  8. mysql数据库d盘_Windows Server 2008 R2下修改MySQL 5.5数据库目录为D盘
  9. 【POJ 3469】Dual Core CPU【最小割】
  10. elman神经网络的实现
  11. Blue Coat:打击移动领域的坏人
  12. 中南网络教育计算机基础在线作业二,《计算机应用基础》2(G)在线作业答案
  13. SQL Sserver 2005 精简版 必须要注意的事情
  14. 内联函数let、also、with、run、apply的用法
  15. Lake Shore PT-100铂电阻温度传感器
  16. 泰坦尼克号人员预测模型(python/jupyter-notebook/数据挖掘/数据分析)
  17. python3中aiohttp+asyncio 高效率爬取图片例子,本地保存
  18. Unable to access jar file xxx.jar
  19. 欢迎来到Jsp编程课时十——Servlect+Jsp基础回顾。
  20. d3.js:取代d3.mouse的d3.pointer

热门文章

  1. nginx 怎么重新编译安装mysql,centos 下 编译安装 nginx + mysql + php 服务
  2. 小程序分享到朋友圈_如何给小程序添加分享朋友圈
  3. 详细js读取execl内容并展示
  4. 【转】C++学习四 冒泡排序法的一些改进
  5. 【转】如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)
  6. 【转】!Dynamics 365 Online通过OAuth 2 Client Credential授权(Server-to-Server Authentication)后调用Web API
  7. 【转】Magento 2数据库EAV模型结构
  8. Python中的魔法方法
  9. 【转】DevOps到底是什么意思?
  10. 【计蒜客 - 蓝桥训练】修建公路(贪心,或运算,dp)