我问了一个类似的问题,这是一个更具体的版本,希望能得到明确的答案。

在尝试了解Java通用类型和通配符"?"的用法时,我尝试了以下操作:

List li4 = new ArrayList();

li4.add(new Integer(5));

Integer myInt4 = li4.get(0);

现在,我用更通用的类型替换"

List extends Integer> li = new ArrayList();

Integer myInt = li.get(0);

以上编译良好。

似乎上面的" li"被视为一个列表,其中每个元素都是一个整数(请看li.get(0)调用)。

我还可以执行以下操作:

li = li4;

上面的代码可以正常运行。

但是当我尝试:

li.add(new Integer(5));

我收到以下编译错误(使用Oracle JDeveloper作为IDE):

Error(24,9):  cannot find method add(java.lang.Integer)

"? 扩展整数"应该允许任何扩展整数的类型。 它的行为类似于" get"方法,它返回一个整数。 同样,将ArrayList分配给它时也不会抱怨。 因此,例如'li = new ArrayList()'不会编译。 那么,为什么允许我分配另一个ArrayList(),取回一个整数但不添加一个整数?

? extends Integer并不意味着"应该允许任何扩展Integer的类型"。这意味着对于扩展Integer的某些特定T,这是List< T >。

因此,从List extends Integer>中获得的任何内容都会扩展Integer,但是您不能只放入任何内容-我们不知道您放入的类型是否匹配T。

举一个具体的例子,Integer扩展了Number。所以你可以写

List extends Number> list1 = new ArrayList();

List extends Number> list2 = new ArrayList();

但是您不应该写list2.add(new MyNumber())或list2.add(new Integer(3)),因为list2实际上是List。

您提到"针对扩展Integer的某些特定T"。 如果该特定T扩展了Integer,则T必须至少具有在Integer中发现的行为。

是的,但是它可能会有更多的行为。 因此,如果尝试仅将普通的Integer添加到List extends Integer>,则它可能没有应有的所有行为。

以下代码帮助我理解了答案:

List exL = new ArrayList();

exL.add(new Exception());

Exception ex = exL.get(0);

Throwable th = exL.get(0);

exL.add(new NullPointerException());

/** Error(153,7):  cannot find method add(java.lang.Exception)

exL.add(new Throwable());

**/

因此,当我们声明List时,元素至少必须具有Exception的行为,这意味着Exception,RuntimeException及其子类。可以将从此类列表返回的元素分配给Exception或其任何子类。"异常e = exL.get(0)"或"可抛出th = exL.get(0)"。也可以将Exception的实例添加或说NullPointerException到List中。

列表genExcepList,可以是List,List或List,因为"?extends Exception"表示Exception及其所有子类。实际上,List是List,List等的超类。对于这些列表类型中的任何一种,从" get"调用返回的元素都保证为Exception类型。因此可以这样做:异常e = genExcepList.get(0)。但是调用genExcepList.add(exception)并不可行,因为List必须满足它允许的每种类型的限制,包括List,List,List等。唯一起作用的是genExcepList.add(null)为'null',适用于每种类型。

另一方面,如果我们有以下内容:

列出rtgs = new ArrayList();

"?super Exception"表示Exception及其任何超类。所以List代表List,List和List。在任何这些列表类型上,都可以调用" add(new Exception());"。因此可以调用rtgs.add(new Exception()),因为Exception也是Throwable and Object。但是,调用" Exception ex = rtgs.get(0)"并不可行,因为从List返回的元素可以是Exception,Throwable和Object中的任何一个。因此,唯一可以安全工作的是"对象ex = rtgs.get(0)"。

java泛型中的通配符是_理解在Java泛型中使用通配符?相关推荐

  1. java中字符流 字节流_理解Java中字符流与字节流的区别

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可 ...

  2. 安卓 java内存碎片_理解Android Java垃圾回收机制

    Jvm(Java虚拟机)内存模型 从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线. Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆. 堆是运行 ...

  3. java中日期怎么比较_如何比较Java中的日期?

    TL:DRLocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;Boolean isBetween ...

  4. java 反射父类私有属性值_如何在Java中通过反射访问父类的父类的私有字段? - java...

    在一个API中,我使用的是一个抽象类(A类),该类具有一个私有字段(A.privateField). B类在API中扩展了A类. 我需要扩展B类的实现,即C类,但是我需要A类的privateField ...

  5. java获取当前项目相对路径_怎样在JAVA文件中获取该项目的相对路径

    1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如: C:\xyz\test.txt 代表了test.txt文件的绝对路径.http://ww ...

  6. java中什么是类型_什么是Java中基本数据类型?

    Java中除了二进制文件和使用文本文件外还有基于Data的数据操作,这里的Data指的是Java的基本数据类型和String.基本数据类型包括byte.int.char.long.float.doub ...

  7. java做日历怎么对齐日期_如何使用Java日历从日期中减去X天?

    如何使用Java日历从日期中减去X天? 有人知道使用Java日历从日期中减去X天的简单方法吗? 我无法找到任何允许我直接从Java中的日期减去X天的函数. 有人能指出我正确的方向吗? 9个解决方案 2 ...

  8. python中hashmap的方法_如何为Java的HashMap模拟Python的dict的“ items(...

    我知道我应该学习如何使用Java进行高效编程,而不再认为它是Python.但是问题在于,这种事情在Java中变成了一场噩梦. 我在Python中具有以下函数,该函数将字符串作为参数: def deco ...

  9. java byte 图片浏览器直接显示_在imge控件中直接显示图片(图片是byte[]格式)

    在工作过程中遇到了这个问题,在网上查了一些资料,结合自己的解决方法及解决过程总结了下,方面以后查阅.如果能帮到同样遇到这个问题的你,将非常高兴哦~_~ 由于asp.net中的Image控件是在Syst ...

最新文章

  1. 如何判断一个字符串在JavaScript中是否包含某个字符?
  2. flask 检测post是否为空_使用Flask搭建一个校园论坛-4
  3. 【转】[程序集清单定义与程序集引用不匹配]分析及解决
  4. Java 新手习题()
  5. window.open打开新窗口被浏览器拦截的处理方法
  6. Qemu-6.1.0多热补丁管理
  7. java开发技术心得_Java开发核心技术面试心得分析
  8. 关于shell读取文件打印时展开通配符
  9. ubuntu linux设置网关,ubuntu修改静态IP网关
  10. 「leetcode」142.环形链表II,如何求环?如何找入口?各个细节讲的明明白白!你疑惑的地方,这里都有!
  11. mysql secure file_mysql load data secure-file-priv问题
  12. [HITSC]哈工大2020春软件构造Lab3实验报告
  13. Query Planning(查询方案)(搜索一)
  14. 5个最好的在线文件共享网站
  15. 如何理解假设检验中的假设设计?
  16. 符号及符号表是什么?
  17. 【从零开始学Skynet】基础篇(二):了解Skynet
  18. java 鸡和兔一共35只_鸡和兔一共有35只,数一数腿有94条,鸡、兔各有多少只?...
  19. [软件发布]WAP网站在线浏览器 WapReader
  20. 实训二:交换机的配置模式

热门文章

  1. Arduino - I2C通信协议(附.mlx90614红外温度传感器)
  2. JQuery在线引用地址整理
  3. 如何通过无人机航空摄影获取测绘成果?
  4. maven实战--读书笔记之第一章和第二章
  5. linux 常见分区标识,linux与设备磁盘分区的方式与标识(三)
  6. 阿里云盘官网登陆入口
  7. 计算机专业用r5跟i5,笔记本电脑r5和i5区别
  8. 淘宝秒杀活动18亿人次参加:成史上最牛促销
  9. 互联网个性化推荐与精准营销实战视频教程
  10. 【基于蜂鸟地图二次开发工具,方便开发者快速开发业务】