java泛型中的通配符是_理解在Java泛型中使用通配符?
我问了一个类似的问题,这是一个更具体的版本,希望能得到明确的答案。
在尝试了解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泛型中使用通配符?相关推荐
- java中字符流 字节流_理解Java中字符流与字节流的区别
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可 ...
- 安卓 java内存碎片_理解Android Java垃圾回收机制
Jvm(Java虚拟机)内存模型 从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线. Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆. 堆是运行 ...
- java中日期怎么比较_如何比较Java中的日期?
TL:DRLocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;Boolean isBetween ...
- java 反射父类私有属性值_如何在Java中通过反射访问父类的父类的私有字段? - java...
在一个API中,我使用的是一个抽象类(A类),该类具有一个私有字段(A.privateField). B类在API中扩展了A类. 我需要扩展B类的实现,即C类,但是我需要A类的privateField ...
- java获取当前项目相对路径_怎样在JAVA文件中获取该项目的相对路径
1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如: C:\xyz\test.txt 代表了test.txt文件的绝对路径.http://ww ...
- java中什么是类型_什么是Java中基本数据类型?
Java中除了二进制文件和使用文本文件外还有基于Data的数据操作,这里的Data指的是Java的基本数据类型和String.基本数据类型包括byte.int.char.long.float.doub ...
- java做日历怎么对齐日期_如何使用Java日历从日期中减去X天?
如何使用Java日历从日期中减去X天? 有人知道使用Java日历从日期中减去X天的简单方法吗? 我无法找到任何允许我直接从Java中的日期减去X天的函数. 有人能指出我正确的方向吗? 9个解决方案 2 ...
- python中hashmap的方法_如何为Java的HashMap模拟Python的dict的“ items(...
我知道我应该学习如何使用Java进行高效编程,而不再认为它是Python.但是问题在于,这种事情在Java中变成了一场噩梦. 我在Python中具有以下函数,该函数将字符串作为参数: def deco ...
- java byte 图片浏览器直接显示_在imge控件中直接显示图片(图片是byte[]格式)
在工作过程中遇到了这个问题,在网上查了一些资料,结合自己的解决方法及解决过程总结了下,方面以后查阅.如果能帮到同样遇到这个问题的你,将非常高兴哦~_~ 由于asp.net中的Image控件是在Syst ...
最新文章
- 如何判断一个字符串在JavaScript中是否包含某个字符?
- flask 检测post是否为空_使用Flask搭建一个校园论坛-4
- 【转】[程序集清单定义与程序集引用不匹配]分析及解决
- Java 新手习题()
- window.open打开新窗口被浏览器拦截的处理方法
- Qemu-6.1.0多热补丁管理
- java开发技术心得_Java开发核心技术面试心得分析
- 关于shell读取文件打印时展开通配符
- ubuntu linux设置网关,ubuntu修改静态IP网关
- 「leetcode」142.环形链表II,如何求环?如何找入口?各个细节讲的明明白白!你疑惑的地方,这里都有!
- mysql secure file_mysql load data secure-file-priv问题
- [HITSC]哈工大2020春软件构造Lab3实验报告
- Query Planning(查询方案)(搜索一)
- 5个最好的在线文件共享网站
- 如何理解假设检验中的假设设计?
- 符号及符号表是什么?
- 【从零开始学Skynet】基础篇(二):了解Skynet
- java 鸡和兔一共35只_鸡和兔一共有35只,数一数腿有94条,鸡、兔各有多少只?...
- [软件发布]WAP网站在线浏览器 WapReader
- 实训二:交换机的配置模式