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
  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql书写规则_每天10分钟带你学会MySQL(二)SQL语句的基本书写规则

SQL语句时必须要遵守一些规则。这些规则都非常简单&#xff0c;接下来就让我们逐一认识一下吧。1&#xff0c;SQL语句以分号(;)结尾。■SQL语句要以分号(;)结 尾一条SQL语句可以描述一个数据库操作。在RDBMS当中&#xff0c;SQL语句也是逐条执行的。众所周知&#xff0c;我们在…

《剑指Offer》52:两个链表的第一个公共节点

题目 输入两个链表&#xff0c;找出它们的第一个公共节点。 public static class ListNode{public int val;public ListNode next;public ListNode(int val) {this.val val;} }分析 首先遍历两链表的长度。在第二次遍历的时候&#xff0c;在较长的链表上先走若干步&#xf…

mysql win 64_win10下装mysql-5.7.18-winx64

步骤1官网下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/选择手动安装版&#xff1a;解压到D盘mysql文件夹下&#xff1a;比以往的版本里缺少了两个.ini文件&#xff0c;直接copy过来&#xff0c;进行修改,my.ini&#xff1a;[client]port3306default-character-…

《剑指Offer》62:圆圈中最后剩下的数字(约瑟夫环)

题目 0,1,2…,n-1这n个数字排成一个圆圈&#xff0c;从数字0开始&#xff0c;每次从这圆圈你删除第m个数字。求出这个圆圈里剩下的最后一个数字。 例如&#xff0c;0、1、2、3、4这5个数字组成一个圆圈&#xff0c;从数字0开始每次删除第3个数字&#xff0c;则删除的前4个数字…

mysql数据库老是被锁怎么解决_Mysql数据库全局锁是如何引起的,如何解决?

2019-01-08 回答乐观锁与悲观锁不同的是&#xff0c;它是一种逻辑上的锁&#xff0c;而不需要数据库提供锁机制来支持当数据很重要&#xff0c;回滚或重试一次需要很大的开销时&#xff0c;需要保证操作的acid性质&#xff0c;此时应该采用悲观锁而当数据对即时的一致性要求不高…

我们边吃曲奇边聊——Cookie与Session那些事

Cookie与Session分别是什么&#xff1f; HTTP Cookie&#xff08;也叫 Web Cookie 或浏览器 Cookie&#xff09;是服务器发送到用户浏览器并保存在本地的一小块数据&#xff0c;它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。 通常&#xff0c;它用于告知…

mysql 不能添加外键 1215_MySQL错误1215:无法添加外键约束

我正在尝试将新模式转发工程到我的数据库服务器上&#xff0c;但是我不知道为什么会收到此错误。我试图在这里搜索答案&#xff0c;但是我发现的所有内容都说是将db引擎设置为Innodb或确保要用作外键的键是它们自己表中的主键。如果我没记错的话&#xff0c;我都做过这两件事。…

JMH初体验

什么是JMH JMH是 Java Microbenchmark Harness 的缩写。中文意思大致是 “JAVA 微基准测试套件”。 基准测试是指通过设计科学的测试方法、测试工具和测试系统&#xff0c;实现对一类测试对象的某项性能指标进行定量的和可对比的测试。——百度百科 为什么要使用 JMH 基准测试…

java map取第一个元素_Java Set接口 Map 与枚举

Set接口概述一个不包含重复元素的 collection。更确切地讲&#xff0c;set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2&#xff0c;并且最多包含一个 null 元素特点Set接口是无序的 Set 是继承于Collection的接口。它是一个不允许有重复元素的集合。Set可以存储null值,但是nu…

Python中yield简单用法

Python中yield简单用法 你或许知道带有yield的函数在Python中被称之为generator&#xff0c;那何为 generator&#xff1f; 我们暂时抛开generator&#xff0c;先从一个常见编程题目开始&#xff0c;循序渐进了解yield的概念。 生成Fibonacci数列 Fibonacci数列是一个经典递…

js 用下标获取map值_js map方法处理返回数据,获取指定数据简写方法

map方法处理返回数据&#xff0c;获取指定数据简写方法前言后端返回数据为数组列表时&#xff0c;通常比较全面&#xff0c;包含了很多不需要的数据&#xff0c;可以通过 map 方法处理返回数据&#xff0c;筛选出想要的数据例如// 返回数据res [{id: 1,name: zhangsan,age: 16…

《Python Cookbook 3rd》笔记汇总

文章目录一、数据结构二、字符串和文本三、数字、日期和时间四、迭代器与生成器五、文件与IO一、数据结构 标题关键词1.1&#xff1a;拆分序列后赋值给多个变量可迭代对象、拆分赋值1.2&#xff1a;拆分任意长可迭代对象后赋值给多个变量可迭代对象、拆分赋值、星号表达式1.3&…

mysql hp ux_hp ux apa 切换

(HP-UX Only) OR - 1 heartbeat network using APA with 2 trunk members (HP-UX Only) OR - 1 heartbeat network with serial line (HP-UX Only) OR......一、 概述 HP 的 APA 软件提供两种网卡冗余切换模式,用以实现网络高可用性...0x000000000000 hp_apa HP-UX 11i v3 Prer…

Python中[:]与[::]的用法

Python中[:]与[::]的用法 概述 [:]与[::]语法是通用序列操作&#xff08;Common Sequence Operations&#xff09;其中的两个。用[:]或[::]对多数序列类型&#xff08;可变的或不可变的&#xff09;&#xff08;如字符串、列表等&#xff09;序列中元素进行截取。 [:]的用法…

mysql redis 中间件_Docker快速搭建Mysql社区版,Redis,MongoDb、MQ等等中间件。

一&#xff1a;安装docker社区版。Centos系列(最好用7以上的版本&#xff0c;docker需要3.1以上的linux内核版本)sudo yum install docker-ce docker-ce-cli containerd.iosudo systemctl start dockersudo docker run hello-world如果你敲docker info需要root密码&#xff0c;…

JavaScript中String的slice(),substr(),substring()三者区别

JavaScript中String的slice()&#xff0c;substr()&#xff0c;substring()三者区别 共同之处 从给定的字符串中截取片段&#xff0c;并返回全新的这片段的字符串对象&#xff0c;且不会改动原字符串。 具体不同之处 slice() str.slice(beginIndex[, endIndex])参数描述be…

pythontuple数据类型_数据类型-元组Tuple

Python Tuple用于存储不可变python对象的序列。元组类似于列表&#xff0c;因为可以改变列表中存储的项的值&#xff0c;而元组是不可变的&#xff0c;并且不能改变存储在元组中的项的值。元组可以写成用小括号括起来的逗号分隔值的集合。元组可以定义如下。T1 (101, "Ay…

《剑指Offer》24:反转链表

题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转链表并输出反转后链表的头节点。链表节点定义如下&#xff1a; public static class ListNode{public int val;public ListNode next;public ListNode(int val) {this.val val;} }分析 方法一&#xff1…

python两个for循环为什么第二个循环里值不变_两个for循环,第二个只在第一个迭代python上执行...

我是一个pythonnoob&#xff0c;我试图比较两个文件中的行之间的值&#xff0c;如果行在第二个文件中&#xff0c;则输出“line name”&#xff0c;然后输出1&#xff1b;如果第二个文件中缺少该行&#xff0c;则输出0。第一次迭代返回1&#xff0c;因为该行在第二个文件中&…

python如何问问题_学会正确的提问

可能很多读者看到这个标题会感觉很可笑&#xff0c;提问谁不会啊&#xff0c;互联网时代&#xff0c;提问还不是一句话的事情&#xff1f;个人、技术群、论坛里都可以提问啊&#xff0c;「你好」「在吗&#xff1f;」「有人用过 xx 工具吗&#xff1f;」。首先&#xff0c;提问…