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

使用HashMap时,Java11中的ClassCastException但不是Java8中的ClassCastException?

如何解决《使用HashMap时,Java11中的ClassCastException但不是Java8中的ClassCastException?》经验,为你挑选了1个好方法。

请看一下我的代码:

Object lOngL= 2548214;
Map map = new HashMap(1);
map.put("LongNumber", longL);
List> returnlist = new ArrayList(10);
returnlist.add(map);

List versionMap1 = new ArrayList(10);
versionMap1.add(returnlist);

List> docIdVersiOnNameMap= new ArrayList<>();
docIdVersionNameMap.addAll((List>)versionMap1.get(0));

Map versiOnDoc=docIdVersionNameMap.get(0);

Map versiOnDocInfo=new HashMap(1);
versionDocInfo.put(versionDoc.get("LongNumber"),"abc");
System.out.println(versionDocInfo.toString());

在Java_1.8_60(编译并运行)中,此代码运行良好,但是在Java 11中编译并运行时,它将引发以下异常:

Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of l
oader 'bootstrap')
        at teststringandlong.Trial.main(Trial.java:35)

Java 11中有关HashMap的变化吗?



1> Jorn Vernee..:

ClassCastException被抛出是正确的。JDK-8058199javac在JDK 9中修复了一个错误,该错误未引起它被抛出。从技术上讲,您的代码依赖于不清除堆污染,因此永远不能保证它不会损坏。

基本上,在Java 11中(但从9开始),"LongNumber"在从第二行到最后一行的map 获取值之后,插入了额外的强制转换。这个:

versionDocInfo.put(versionDoc.get("LongNumber"),"abc");

编译为:

versionDocInfo.put((String) versionDoc.get("LongNumber"),"abc");

使用编译代码时javac 1.8.0_162,倒数第二行的字节码为:

 114: aload         7
 116: aload         6
 118: ldc           #6                  // String LongNumber
 120: invokeinterface #16,  2           // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
 125: ldc           #17                 // String abc
 127: invokeinterface #7,  3            // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

请注意,checkcast之后没有任何指令120:。但是,使用时javac 9.0.4

 114: aload         7
 116: aload         6
 118: ldc           #6                  // String LongNumber
 120: invokeinterface #16,  2           // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
 125: checkcast     #17                 // class java/lang/String
 128: ldc           #18                 // String abc
 130: invokeinterface #7,  3            // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

请注意,这里有一条checkcast说明125:

该指令有所不同,因为它基本上是在从versionDoc映射中获取值之后进行额外的类型检查。基本上这样做:

versionDocInfo.put((String) versionDoc.get("LongNumber"),"abc");

在Java 11中(从9开始)。


如评论中所述;的值类型"LongNumber"Integer,这是在a内的,这是Map因为之前未选中的几行强制转换:

docIdVersionNameMap.addAll((List>) versionMap1.get(0));

即使其中一个值是,您也可以将a间接转换Map为a 。区别仅在于,从地图获取值后,需要进行额外的强制转换来检查类型。MapInteger

请注意,缺少的checkcast是中的错误javac,因此使用其他编译器或不同版本进行编译javac可能会导致不同的行为。


@YassinHajaj我不确定jdoodle.com,使用的Java 10版本与此相同,但是正在抛出CCE。必须与它们的设置有关...使用例如var x = 10进行测试,这无法在jdoodle.com上进行编译,因此我想他们正在使用JDK 8中的Javac进行编译,然后与Java 10一起运行。
推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 一、HashSet1.虑重功能特性(HashMap实现)2.put(key)如果重复返回false***Add ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • Java 7新功能介绍及与Java1.7性能测试比较
    我们将进行Java7新功能和Java1.7性能测试比较,一般来说Java7新功能主要是对更多类的支持以及加载的架构。而Java7与Java1.5,1.6,1.7的性能测试比较,我们会得出结论, ... [详细]
author-avatar
微软Kindle批发
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有