TypechoJoeTheme

香草物语

统计
登录
用户名
密码
/
注册
用户名
邮箱
输入密码
确认密码

java类型转换的一些问题及处理

Laughing博主
2021-11-14
/
0 评论
/
823 阅读
/
687 个字
/
百度已收录
11/14
本文最后更新于2024年03月16日,已超过188天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

最近在项目上被类型转换坑了不少。特以此文做一下记录。

问题出在哪

以前在项目开发的时候,在数据访问层,基本上是使用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数据库中,取出的ObjectInteger,但是在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()返回的是基本类型intInteger.valueOf()返回的是对象类型Integer

区别二:Integer.parseInt()返回的是基本类型intInteger.valueOf()返回的是对象类型Integer

朗读
赞(1)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

香草物语

本文链接:

https://www.xiangcaowuyu.net/java/some-problems-and-solutions-of-java-type-conversion.html(转载时请注明本文出处及文章链接)

评论 (0)