Java中<? super T>和List<? extends T>的区别
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
- 读 - 上面给出可能的赋值式,你能确保从
List foo3
读取什么类型的对象?:- 你可以读取一个
Number
,因为任意包含一个Number
或一个Number
子类的列表都可赋值于foo3
。 - 你不可读取一个
Integer
,因为foo3
可以指List<Double>
。 - 你不可读取一个
Double
,因为foo3
可以指List<Integer>
。
- 你可以读取一个
- 写 - 上面给出可能的赋值式,你能添加什么类型的对象至
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
- 读 - 上面给出可能的赋值式,你能确保从
List foo3
读取什么类型的对象?:- 你不能确保读取一个
Integer
,因为foo3
可以指List<Number>
或List<Object>
。 - 你不能确保读取一个
Number
,因为foo3
可以指List<Object>
。 - 唯一能确定的是你能读取一个
Object
或Object
子类的对象(但是你不知道具体哪个子类)。
- 你不能确保读取一个
- 写 - 上面给出可能的赋值式,你能添加什么类型的对象至
List foo3
?:- 你可以添加一个
Integer
或Integer
的子类。 - 你不能添加一个
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>的区别相关推荐
- IO流 (五) ----- 对象数据的序列化与反序列化
相关文章: <IO流 (一) ----- 基本概念和File类> <IO流 (二) ----- 文件流> <IO流 (三) ----- 字符流和字符缓冲流> < ...
- 菜鸟学习笔记:Java提升篇6(IO流2——数据类型处理流、打印流、随机流)
菜鸟学习笔记:Java IO流2--其他流 字节数组输入输出流 数据类型处理流 基本数据类型 引用类型 打印流 System.in.System.out.System.err 随机流RandomAcc ...
- 菜鸟学习笔记:Java提升篇5(IO流1——IO流的概念、字节流、字符流、缓冲流、转换流)
菜鸟学习笔记:Java IO流1--IO流的概念.字节流.字符流.缓冲流.转换流 IO流的原理及概念 节点流 字节流 文件读取 文件写出 文件拷贝 文件夹拷贝 字符流 文件读取 文件写出 处理流 缓冲 ...
- Java裁剪音乐,利用IO流
** Java裁剪音乐,利用IO流 ** 主方法 public static void main(String[] args) throws IOException {//输入流对象,路径要裁剪文件路 ...
- java流类图结构_java学习之IO流(学习之旅,一)
个人在学习IO流的时候看到如下所示java 流类图结构的时候,我的感想是,这么多··处于蒙的状态. Java流类图结构 这么多,没有分类不好学,那我们就慢慢一口一口的吃,这样每天学习一点就好了,其实很 ...
- java字符流输出流_JAVA语言之IO流字符串输入输出流
本文主要向大家介绍了JAVA语言之IO流字符串输入输出流,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 概述 StringReader 字符输入流 和CharArrayReader类 ...
- java 弹出另存为_java如何实现 io流传输过来的文件,提示另存为弹出窗口?
java如何实现 io流传输过来的文件,提示另存为弹出窗口? mip版 关注:166 答案:6 悬赏:0 解决时间 2021-01-24 22:00 已解决 2021-01-24 11:06 最 ...
- JAVA-SE中:集合,IO流,文件与异常
java.util.Collection java集合是存储对象的工具类,有两个常见子接口 Set: 不可重复集,重复元素不能放入集合两次以上, 顺序不定 List: 可重复集:ArrayList() ...
- java byte char io流_Java基础进阶 IO流之字节流
1.IO流 1.1.概述 之前学习的File类它只能操作文件或文件夹,并不能去操作文件中的数据.真正保存数据的是文件,数据是在文件中.而File类它只是去对文件本身做操作,不能对文件中的数据进行操作. ...
- java io的异常_Java 异常与IO流
一.异常 想想一下代码会发生什么? public static voidmain(String[] args) {int a = 10;int b = 0; System.out.println(a/ ...
最新文章
- 关于matlab向文件写入数据的方法——留着备用
- 面试:你了解中兴吗_HTTP简介:您需要了解的所有内容
- 在二分类问题中,准确率一直处于50%上下的解决方法
- 互斥锁、共享内存方式以及生产者消费者模型
- 十九、“文捷笔妙活如水,气定神闲稳若山。”(2021.6.7)
- pyspark.zip/pyspark/worker.py:53: UnicodeWarning: Unicode equal comparison failed to convert both ar
- Google首席决策师告诉你,AI和数据科学团队需要哪10种角色
- mysql数据库d盘_Windows Server 2008 R2下修改MySQL 5.5数据库目录为D盘
- 【POJ 3469】Dual Core CPU【最小割】
- elman神经网络的实现
- Blue Coat:打击移动领域的坏人
- 中南网络教育计算机基础在线作业二,《计算机应用基础》2(G)在线作业答案
- SQL Sserver 2005 精简版 必须要注意的事情
- 内联函数let、also、with、run、apply的用法
- Lake Shore PT-100铂电阻温度传感器
- 泰坦尼克号人员预测模型(python/jupyter-notebook/数据挖掘/数据分析)
- python3中aiohttp+asyncio 高效率爬取图片例子,本地保存
- Unable to access jar file xxx.jar
- 欢迎来到Jsp编程课时十——Servlect+Jsp基础回顾。
- d3.js:取代d3.mouse的d3.pointer
热门文章
- nginx 怎么重新编译安装mysql,centos 下 编译安装 nginx + mysql + php 服务
- 小程序分享到朋友圈_如何给小程序添加分享朋友圈
- 详细js读取execl内容并展示
- 【转】C++学习四 冒泡排序法的一些改进
- 【转】如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)
- 【转】!Dynamics 365 Online通过OAuth 2 Client Credential授权(Server-to-Server Authentication)后调用Web API
- 【转】Magento 2数据库EAV模型结构
- Python中的魔法方法
- 【转】DevOps到底是什么意思?
- 【计蒜客 - 蓝桥训练】修建公路(贪心,或运算,dp)