一个由Java泛型类型擦除引起的问题

JAVA泛型-类型擦除太恶心,但项目中大量使用,以及类型擦除引起的问题及解决方法 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(String[] args) { 4 List list = new ArrayList(); 5 list.add("qqyumidi"); 6 阅读详情

问题发生

  1. 项目工具及框架: mybatis-plus,springboot,jackson做json序列化处理器。
  2. 业务需求:搞了一个字段,字段类型是json。字段在java对应中对应的属性是一个枚举类型的List.
  3. 展现情况:利用mybatis-plus,存入时很正常的存入了枚举name组成的数组。查看的时候出现了问题,取出对象时是正常的。而当我访问那个枚举数组时,只要一访问这其中的元素,就出现了报错。
    java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum

问题定位

当时第一反应肯定是自己代码写的有问题,因为单个枚举类是可以直接转换的,存取都没有问题。确认了一下,没有问题。

然后也排除了jackson,mybatis-plus的问题,因为存入是正常的,而且报错的异常似乎来自于jdk。

最后通过断点和vm那些命令的方式,发现在访问这个元素前,我看不到这个数组下面的元素类型居然是string。。

确定问题–Java类型擦除

由于java的泛型是伪泛型,因为Java在编译期间,所有的泛型相关信息都会被“擦掉“,字节码中不包含任何类型信息,简单来说在编译器层次实现泛型时,生成的字节码是不包含泛型中的类型信息的。

举个例子,比如List和HashMap这样的容器,如论List还是List 在编译过程中,都会变成List,JVM对泛型是看不到的(C++没有这个坑),在对访问这些元素的时候,有时候就会出现问题。因为访问元素时会更具类型走强转,比如说Object i ,会用(Integer)i,如果是基本类型的包装类确实可以直接强转,而使用枚举类,强转就会报上面的错。

解决问题

目前用的一种比较粗暴的方法。声明一个类继承ArrayList,声明构造方法,使用这个类去定义属性即可。

应该还有从枚举本身出发的方法

Java泛型类型擦除问题 以前就了解过Java泛型的实现是不完整的,最近在做一些代码重构的时候遇到一些Java泛型类型擦除的问题,简单的来说,Java泛型中所指定的类型在编译时会将其去除,因此List和 List 在编译成字节码的时候实际上是一样的。因此java泛型只能做到编译期检查的功能,运行期间就不能保证类型安全。我最近遇到的一个问题如下: 假设有两个bean类 /** Test. */ @Data @NoArgsConstructor @AllArgsConstructor public static class Fo. 阅读详情

相关推荐

Java泛型编程如何避免类型擦除问题

类型擦除是指在编译时,泛型类型信息被擦除,替换为它们的原始类型(如Object)。理解类型擦除的原理和影响,以及掌握如何在编程中处理这些问题,将有助于我们更好地利用Java泛型编程的优势,提高代码的质量和可维护性。因此,在运行时,泛型类型信息不再存在,导致无法直接访问这些类型。例如,我们可以为泛型类添加一个Class类型的类型参数,以便在运行时访问泛型类型。通过利用这些特性,我们可以减少显式类型参数的使用,从而减轻类型擦除带来的负担。通过这种方式,我们可以在运行时访问泛型类型,从而避免一些类型擦除问题。

JessicaAustin的博客 1216

成功解决java.lang.String cannot be cast to java.lang.Integer异常的正确解决方法,亲测有效!!!

成功解决java.lang.String cannot be cast to java.lang.Integer异常的正确解决方法,亲测有效!!!

m0_66793065的博客 3862

Minio HTTPS证书配置实战:从申请到部署全流程

本文详细介绍了Minio HTTPS证书配置的全流程,从申请到部署,确保对象存储服务的安全性。内容包括证书类型选择、文件处理、服务配置调整及常见问题解决,帮助用户在生产环境中快速实现HTTPS加密传输,提升数据安全。

weixin_42638178的博客 431

Jackson 2.x 系列【4】对象映射器 ObjectMapper

在前两篇文档中,我们学习了JsonGenerator和JsonParser的简单用法,实际开发中很少用到它们,因为它们属于低级API,自由度高但比较复杂。 我们使用最多的还是ObjectMapper,他是jackson-databind数据绑定模块提供面向用户的高级API。

记录知识、锤炼自我 2954

【深圳】IBM V3500存储维修 更换控制器故障

今天给大家分享的是深圳.福田区一个电商客户公司一台IBM Storwize v3500存储控制器故障从远程诊断 收集日志 分析结果的实际案例,如图所示通过存储管理口登陆进去后直接看到少了一个控制器,经过工程师分析日志后判定为该控制器损坏,接下来更换控制器配件,标准套件的控制器不带子卡和电池,所以需要把故障控制器上的子卡和电池拆下来装到新控制器上,这个电池拆还需要点技巧,接着把新的控制器插回V3500主机,等待大约十分钟后,新控制器指示灯全绿,管理界面看到节点已联机;冠峰科技-爱科技爱分享。

OuYangYuXi的博客 4576

医学超声影像研究——从拒稿到录用:我的UMB投稿实战复盘

本文分享了作者将一篇关于超声影像中肿瘤传统分类方法的研究论文,从被其他期刊拒稿到最终被《Ultrasound in Medicine & Biology》录用的完整实战经验。文章详细复盘了心态调整、精准选刊、针对UMB期刊的稿件精修、投稿系统操作细节以及与审稿人有效沟通回复的全过程,为医学影像领域的科研工作者提供了宝贵的投稿策略与实操指南。

stem5的博客 492

解决java.lang.String cannot be cast to java.lang.Integer异常

开发中经常会遇到java.lang.String cannot be cast to java.lang.Integer异常,记录下我怎么解决的。 这种异常就是经常会出现类型转换的地方,这里面有些小坑,必须要踩过,撸源码才知道问题原因,哈哈。 比如我在Double转String,Integer转String的过程中遇到的坑: Double.parseDouble()和Double.valueOf()方法的区别: parseDouble()方法得到的数据类型不能继续编译,因为这个方法得到的是 double ,

ddzyx的博客 4万+

VMware player桥接模式不能联网的解决方法

VMware虚拟机下主要使用两种网络连接方式:桥接模式、NAT模式。 桥接模式:查一下,虚拟机独立IP。 NAT模式:与电脑共享IP、需要映射应用服务的端口。 我的需求需要独立IP,于是使用桥接。 网络连接失败。 个人主机系统的网络设置: 设置 - 网络和 Internet - 更改适配器设置 给虚拟机设置网络适配器 只保留,点击确定,确定。 重新运行虚拟机。 ...

Mark_md的博客 9446

java.lang.String cannot be cast to java.lang.Integer Map拿到参数转换报错

map中的string和我们定义的string不是很一样的,具体是什么我是一只小菜鸟也不是很清楚,所以使用强转是不可以的。1.前端传值传回来的值转为Integer,向上文中intAge转换是没问题的。2、controller层或者service层。

qq_47307140的博客 1856

Python实战:ERA5风场数据区域提取与风向合成可视化全流程解析

本文详细解析了使用Python处理ERA5风场数据的完整流程,包括NC文件读取、特定区域数据提取、u/v分量合成风向风速的计算,以及利用Matplotlib进行风场时空演变可视化。内容涵盖从环境搭建、数据获取到高级绘图与性能优化的实战经验,为气象数据分析、风能评估及气候研究提供了一套清晰、可操作的技术指南。

swift5iosmith的博客 300

FPGA学习之路—应用程序—原码二位乘法器及Verilog代码分析

FPGA学习之路——原码二位乘法器及Verilog代码分析 原理 原码乘法可以分为原码一位乘和原码二位乘,两者在实现规则上大同小异。原码一位乘每次判断乘数的最低位,对被乘数和部分积进行相应操作。而原码二位乘则是对乘数的低二位进行判断,并执行相关操作。 两位乘数的取值可以有四种可能组合,每种组合对应于以下操作: 00相当于0x,部分积Dresult右移2位,不进行其他运算; 01相当于1x,部分积D...

谦豫 3716

【java8】如何为泛型类自定义jackson反序列化器JsonDeserializer

如何在jackson的readValue时为泛型类实现泛型类型的传递? 如何避免在jackson使用中屡屡显式地调用new TypeReference? 如何为自定义的泛型类实现反序列化器? 我们可以带着这些问题,阅读这篇文章

aa250071173的博客 2634

2026年软考高级网络规划设计师第三版备考笔记

删除了所有已退出主流应用、行业淘汰的技术内容,如 HDLC、xDSL、WiMAX、HSRP/GLBP 等,让教材内容更聚焦当下一线网络工程实际场景,剔除无效考点。

鹿鸣天涯 1214

Java泛型类型擦除以及类型擦除带来的问题

目录 1.Java泛型的实现方法:类型擦除 1-2.通过两个例子证明Java类型的类型擦除 例1.原始类型相等 例2.通过反射添加其它类型元素 2.类型擦除后保留的原始类型 例3.原始类型Object 例4.Object泛型 3.类型擦除引起的问题及解决方法 3-1.先检查,再编译以及编译的对象和引用传递问题 3-2.自动类型转换 3-3.类型擦除与多态的冲突和解决方法 3-4.泛型类型变量不能是基本数据类型 3-5.编译时集合的instan...

断翼天使 6644

基于Slim-Neck架构的YOLOv11轻量化特征融合方案(实现超轻量级与高精度的双重突破)

购买即可解锁800+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,每日更新。

m0_64661770的博客 250

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题

参考:java核心技术 一、Java泛型的实现方法:类型擦除 前面已经说了,Java的泛型是伪泛型。为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉。正确理解泛型概念的首要前提是理解类型擦出(type erasure)。 Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在

Kilnn 8万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java泛型类型擦除以及类型擦除带来的问题-总结

Java泛型类型擦除以及类型擦除带来的问题-总结 参考:[原文](Java泛型类型擦除以及类型擦除带来的问题 - 蜗牛大师 - 博客园 (cnblogs.com)) 文章目录Java泛型类型擦除以及类型擦除带来的问题-总结一、Java泛型的实现方法:类型擦除1. 原始类型相等2. 通过反射添加其它类型元素二、类型擦除后保留的原始类型1. 原始类型Object2. Object泛型三、类型擦除引起的问题及解决方法1. 先检查再编译以及编译的对象和引用传递问题2. 自动类型转换3. 类型擦除与多态的冲突和解决办

大魚的个人博客,如有不足,欢迎指正。 516

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

list 泛型_带你深挖Java泛型类型擦除以及类型擦除带来的问题

点击上方“Java知音”,选择“置顶公众号”技术文章第一时间送达!作者:蜗牛大师cnblogs.com/wuqinglong/p/9456193.html1.Java泛型的实现方法:类型擦除大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是...

weixin_39548776的博客 571
上一篇: 几种水平分表方案与具体实践
下一篇: 使用Arthas调优
Tate_Brown
博客等级 码龄9年 39粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值