一次泛型擦除的坑

博客探讨了在使用MyBatis时遇到的类型转换异常,特别是涉及数据库查询结果到List的转换。作者指出,MyBatis在进行类型擦除后,可能会导致JVM在强转时抛出ClassCastException。解决方案是使用String.valueOf避免直接的类型转换。文章还提及了mapper文件的管理策略,并邀请读者分享更好的做法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说报错:
java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String
再说思路。看到这个类转换异常,感觉很好解决。结果看到报错的地方有点晕了。

默认

在这里插入图片描述
第一种其实默认调用的是toString方法,自己最开始也是加的一个toString,因为我想着不管是什么类型,toString方法总是不会报错的吧。结果就报错了。改为第二种办法。String.ValueOf就没有问题了。
来进行分析。

我这个list是从数据库查出来的。是通过mybatis框架得到的。后来发现mybatis进行代理的时候,会进行类型擦除,会把接口定义的List 这种统统擦除,设置为数据库返回的真实类型。
然后jvm编译的时候,也是类型擦除的,但是有些List、Map的get方法,其实是保留了这个对应的类型,也就是调用get方法时,会转换成对应的泛型。这就出现了一个强转。强转就是发生在这里。

那为什么String.valueOf不会报错呢。是因为这个时候还没有出发get之后的toString,这个get得到的其实是数据库返回的Double类型。强转就会报错。
String.valueOf会自动适配对应的类型。接受的参数比较多。

结束。附上几张贴图。

但是一旦你需要操作List的中的元素,在取出元素时,JVM就发现你要的类型是DictContent 而实际上是LinkedHashMap,就会抛出类型转换异常
在这里插入图片描述

话说我现在mapper文件都是自动生成的。然后有些修改,我会搞一个手写的mapper,这样每次修改就不会覆盖了。有其他更好的办法吗?欢迎留言讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值