您的位置:首页 > 编程语言 > Java开发

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

2018-03-22 14:39 330 查看
前段时间遇到一个小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解决了问题。
当然,遇到这种情况,如果允许的话,还是建议修改数据库字段类型和代码中的类型完全对应。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐