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解决了问题。
当然,遇到这种情况,如果允许的话,还是建议修改数据库字段类型和代码中的类型完全对应。
这个问题明白原因之后,改动方法有两个,一是在数据库层面上改;二是在代码层上修改。由于数据库较大,改变表结构还需要停服操作,所以,我选择在代码层修改。取数的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解决了问题。
当然,遇到这种情况,如果允许的话,还是建议修改数据库字段类型和代码中的类型完全对应。
相关文章推荐
- 相同的代码在eclipse中编译成功,但是用ant编译失败。无法确定<T>T的类型参数;对于上限为int,java.lang.Object的类型变量T,不存在唯一最大实例
- Effective Java之对于实例控制,枚举类型优于readResolve(七十七)
- Java开发过程中经常碰到数据类型的问题
- 数组、二维数组、及类型,存储过程调用.相关java
- JVM学习笔记(二)------Java代码编译和执行的整个过程
- 关于JAVA 1.5中对于泛型(参数化类型)的简单说明
- Java编译和运行过程中的编码问题
- Java编译过程与c/c++编译过程有何不同
- JVM学习笔记(二)------Java代码编译和执行的整个过程
- 让aspx页自主控制调用记录的数量,类型,随时更改,不用重新编译!
- 在java + oracle环境下,对于clob类型的数据的插入
- Java编译与执行过程分析
- JVM学习笔记(二)------Java代码编译和执行的整个过程
- JVM学习笔记(1、 基本结构;2、Java代码编译和执行的整个过程3、内存管理和垃圾回收 4、 内存调优 )
- java编译过程与c/c++编译过程不同
- 对java基础数据类型在运算过程中的自动转换的一些分析
- Java编译和运行过程中的编码问题
- Java操作含Clob或者NClob数据类型的存储过程实例
- JVM学习笔记(1、 基本结构;2、Java代码编译和执行的整个过程3、内存管理和垃圾回收 4、 内存调优 )
- Java开发过程中经常碰到数据类型的问题