前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >诡异的类型转换

诡异的类型转换

作者头像
加多
发布2018-09-06 15:06:21
6880
发布2018-09-06 15:06:21
举报
文章被收录于专栏:Java编程技术

一、前言

最近在做应用迁移时候遇到了一个诡异的类型转换问题,感觉比较有意思,就记录下来和大家分享下。

二、问题的产生

原始系统里面有的一个从数据库查询的伪代码如下:

image

image

由于Convert.asInt是webx框架的方法,而现在多维群发是要迁移到springboot上,所以使用下面方法替换了该方法:

image.png

修改后日常环境部署测试抛出如下异常:

代码语言:javascript
复制
Exception in thread "main" java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.String

问题自此产生

三、问题解析

3.1 实验一 不指定泛型的map赋值给指定泛型的map会成功?

下面做个小实验来证明会成功。

image.png

如上代码编译和运行期都是OK的,那么为何会成OK的那,(2)处类型转换时候不应该出错? 其中(1)(2)注释分别为IDE的提示语

  • (1)说明创建了原始类型的hashmap所谓原始类型就是说是Object类型,也就是说HashMap等于HashMap<Object,Object> . 而BigInteger是继承自Object的。
  • (2) 说明类型安全性的一个规则:为了让Map类型能够转换Map<String,String>不进行类型检查。

3.2 实验二 赋值成功后BigInteger类型是如何存放到String类型?

其实Java中泛型与C++的模板是有区别的,C++中指定模板参数后编译后生成的类是使用真实类型替换后的,而Java中泛型编译后生成的类中的类型都是Object,这也叫类型擦除。下面举个例子证明:

image.png

结果会返回true。 也就是说HashMap和HashMap<String,String>编译后生成的实例都是HashMap<Object,Object>

3.3 实验三 到底何时抛出的ClassCastException异常

image.png

如上代码,运行后到底哪里会抛出异常? 其实是第82行代码,那么81行为何不抛出异常那,其实是因为实验2,因为运行时候HashMap<String,String>其实是HashMap<Object,Object>,调用get方法时候调用的就是HashMap的get方法,而82句执行时候会根据=左侧String类型在get的时候进行类型转换也就是进行BigInteger到String的转换,所以异常抛出。

3.4 试验四 如何解决

  • 方案一

image

  • 方案二

image

  • 方案三 其实本文方法getInfo是根本问题所在,下层返回的明明是List类型,为何getInfo返回了List<Map<String, String>>,修改其为List也可以解决,还有持久层一般最好不要返回Map类型,而返回一个DO,DO里面都是严格类型的,不容易出错。

四、 总结

由于Java泛型是编译后生成的类都是原始类型的,所以虽然编译时候不出错,但是运行时还是有可能出现类型转换问题的,不指定泛型参数时候,默认是Object类型,要注意不要使用Object类型的泛型集合赋值到其他泛型类型。另外使用持久化框架时候返回值最后是封装好的Do对象,Do对象里面的属性都是严格类型的,不容易出现问题。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.12.01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、问题的产生
  • 三、问题解析
    • 3.1 实验一 不指定泛型的map赋值给指定泛型的map会成功?
      • 3.2 实验二 赋值成功后BigInteger类型是如何存放到String类型?
        • 3.3 实验三 到底何时抛出的ClassCastException异常
          • 3.4 试验四 如何解决
          • 四、 总结
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档