热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java中<?superT>和List<?extendsT>的区别

Java中

Java中和List的区别


下面通配符声明List foo3的赋值式是合法的:

List<? extends Number> foo3 &#61; new ArrayList<Number>(); // Number "extends" Number (in this context)
List<? extends Number> foo3 &#61; new ArrayList<Integer>(); // Integer extends Number
List<? extends Number> foo3 &#61; new ArrayList<Double>(); // Double extends Number

  1. - 上面给出可能的赋值式&#xff0c;你能确保从List foo3读取什么类型的对象&#xff1f;&#xff1a;
    • 你可以读取一个Number&#xff0c;因为任意包含一个Number或一个Number子类的列表都可赋值于foo3
    • 你不可读取一个Integer&#xff0c;因为foo3可以指List
    • 你不可读取一个Double&#xff0c;因为foo3可以指List
  2. - 上面给出可能的赋值式&#xff0c;你能添加什么类型的对象至List foo3&#xff1f;&#xff1a;
    • 你不能添加一个Integer&#xff0c;因为foo3可以指List
    • 你不能添加一个Double&#xff0c;因为foo3可以指List
    • 你不能添加一个Number&#xff0c;因为foo3可以指List

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


下面通配符声明List foo3的赋值式是合法的&#xff1a;

List<? super Integer> foo3 &#61; new ArrayList<Integer>(); // Integer is a "superclass" of Integer (in this context)
List<? super Integer> foo3 &#61; new ArrayList<Number>(); // Number is a superclass of Integer
List<? super Integer> foo3 &#61; new ArrayList<Object>(); // Object is a superclass of Integer

  1. - 上面给出可能的赋值式&#xff0c;你能确保从List foo3读取什么类型的对象&#xff1f;&#xff1a;
    • 你不能确保读取一个Integer&#xff0c;因为foo3可以指ListList
    • 你不能确保读取一个Number&#xff0c;因为foo3可以指List
    • 唯一能确定的是你能读取一个ObjectObject子类的对象&#xff08;但是你不知道具体哪个子类&#xff09;。
  2. - 上面给出可能的赋值式&#xff0c;你能添加什么类型的对象至List foo3&#xff1f;&#xff1a;
    • 你可以添加一个IntegerInteger的子类。
    • 你不能添加一个Number&#xff0c;因为foo3可以指List
    • 你不能添加一个Object&#xff0c;因为foo3可以指List

PECS

记住PECS: “Producer Extends, Consumer Super”


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

我的助记

  • 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 &#61; 0; i < src.size(); i&#43;&#43;) dest.set(i, src.get(i)); }
}

关于该例更多说明。


参考资料

Difference between and in Java


推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
author-avatar
wzy523
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有