Java编译过程中HashMap对于类型的控制

前段时间遇到一个小bug,详见我这篇博客MySQL中BIGINT与Java数据类型对应问题

这个问题明白原因之后,改动方法有两个,一是在数据库层面上改;二是在代码层上修改。由于数据库较大,改变表结构还需要停服操作,所以,我选择在代码层修改。取数的sql和dao层完全不变,而在需要转化为Long的时候,使用了如下的写法:

Long minId = Long.valueOf(resMap.get("minId").toString());

不管你里面是BigInteger还是Long,我给你转成String,总可以了吧,不过事实证明我还是naive。

系统仍然报错:

java.math.BigInteger can't be cast to java.lang.Long

这让我百思不得其解,我明明是用String转的Long啊,toString()怎么也不会返回BigInteger吧,我怀疑是qa测试的时候没有取新代码,所以准备反编译class文件看看究竟,谁知误打误撞,正好找到了原因,查看class文件的时候,我代码中的这行是这样的:

Long minId = Long.valueOf((Long)resMap.get("minId").toString());

大家注意一下,这里与我写的源码区别在于在toString()触发之前,添加了一个类型强转(Long),这样就解释了为什么我改完之后仍然会报上面的错误。原来编译器识别到resMap是一个<String, Long>的map,它自己知道map里面放的不一定是Long类型的数据(比如我文首提到的那篇博客里的情况),因此做了一个类型转换。

这么一来,我只要Map里面存储的类型不对,就取不出来,因为都是要强转为Long的,即使没有显式写明,编译器也会帮你转换为Long。

最后我把resMap改为HashMap<String, Object>,实际使用的时候将取到的结果toString再转Long解决了问题。

当然,遇到这种情况,如果允许的话,还是建议修改数据库字段类型和代码中的类型完全对应。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值