最近在项目上被类型转换坑了不少。特以此文做一下记录。
问题出在哪
以前在项目开发的时候,在数据访问层,基本上是使用MyBatis,偶尔使用JPA,不管哪种方式,我们数据访问都是建立在实体之上的(极少数情况下也会使用Map,但是这种情况是比较特殊的。
目前公司的开发平台,数据访问层,统一通过平台封装的BQL进行,问题就出现在这个封装的BQL上,它返回的数据类型是List<Map<String,Object>>
类型,这个东西看似灵活(因为是Map
,另外还是Object
的泛型),既然返回的是Object
类型,那就涉及到类型转换的问题。这种Object
的弱类型,也给我们创建实体制作了障碍,比如我们一个实体可能有Integer
类型、String
类型等等。但是,我们总不能把实体全部创建层Object
类型的。
进一步的问题
截止到目前,我们发现的第一个问题就是Object
需要转换成具体的类型。紧接着,我们面临着第二个问题,就是我们通过BQL这个东西建表的时候,我们选择的比如是Integer
类型(整型),我们会发现,在postgre
数据库中,创建的类型确实是Integer
,但是在Oracle
中创建的是Number
类型,然后我们在用BQL取数的时候,在postgre
数据库中,取出的Object
是Integer
,但是在Oracle
中取出的Object
确实BigDecimal
类型,这就让人比较懵逼了。我在创建实体的时候,到底是用Integer
还是用BigDecimal
呢。
如何定义类型
通过上面分析,我们可以确定的是,我们需要的是Integer
而不是BigDecimal
。所以,我们在创建实体时,创建的是一个Integer
类型的。
如何进行类型转换
以上,便引出了我们如何进行类型转换的话题。
在Java中如何进行类型转换呢,我们以Integer
类型为例,常见的方式可能就以下三种。(Integer)obj
:将obj
转换成Integer
类型,这种obj
可以是Object
类型。Integer.parseInt(obj)
:将字符串类型的obj
转成对应的数值。Integer.valueOf(obj)
:将字符串类型的obj
转成对应的数值。
那么这三种方法有啥区别呢,我们以以下代码为例
Object str123 = new BigDecimal("123");
int int123 = (int) str123;
int parseInt = Integer.parseInt(str123.toString());
Integer valueOf = Integer.valueOf(str123.toString());
System.out.println(int123);
System.out.println(parseInt);
System.out.println(valueOf);
以上代码,idea不会给出任何的错误提示
但是我们运行时,会发现int int123 = (int) str123;
这行代码会报错
因为str123
实际是BigDecimal
类型所以(Integer)
报错了。
区别一:(Integer)只能转换相同的类型,否则会报错。
我们跳转代码,可以查看Integer.parseInt()
和Integer.valueOf()
通过上面截图,我们可以看到Integer.parseInt()
和Integer.valueOf()
的区别。Integer.parseInt()
返回的是基本类型int
,Integer.valueOf()
返回的是对象类型Integer
。
评论 (0)