热门标签 | 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一起运行。
推荐阅读
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • Java学习第10天:深入理解Map接口及其应用 ... [详细]
  • Java 7新功能介绍及与Java1.7性能测试比较
    我们将进行Java7新功能和Java1.7性能测试比较,一般来说Java7新功能主要是对更多类的支持以及加载的架构。而Java7与Java1.5,1.6,1.7的性能测试比较,我们会得出结论, ... [详细]
  • Java集合详解5:深入理解LinkedHashMap和LRU缓存
    Java集合详解5:深入理解LinkedHashMap和LRU缓存今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存。具体代码在我的 ... [详细]
  • 我有3个来自RESEARCHS的映射值,指定要使用参考数据集填充的行中的范围。该研究 ... [详细]
  • HashTable与ConcurrentHashMap均可实现HashMap的功能,对外提供了键值对存储的数据结构。但是在内部结构及实现上有何区别,性能上的差异到底在哪里又是如何导致的 ... [详细]
  • 转载自:http:www.blogjava.netCarpenterLeearchive20160427430268.html总体介绍之所以把HashSet和HashMa ... [详细]
  • 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每 ... [详细]
  • 本篇文章给大家分享的是有关Java中怎么对HashMap按键值排序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话 ... [详细]
  • ***功能:排序*privatestaticvoidoutputRegionStatistics(HashMap<String,Integer>regionMap){ ... [详细]
  • android布局基础及范例(二):人人android九宫格布局
    人人android是人人网推出的一款优秀的手机应用软件,我们在使用的时候发现他的首页布局是九宫格模式的,让人觉得很别致,因为现在很多的android软件很少使用这种布局模式,人人andr ... [详细]
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社区 版权所有