Java中使用三元运算符为Object变量赋值Integer或Double时自动转为Double的问题
Java中使用三元运算符为Object变量赋值Integer或Double时自动转为Double的问题
嘿,这个问题我之前也踩过坑!核心原因是Java的三元运算符?:有严格的类型匹配与提升规则,并不是直接把两个分支的结果直接赋值给Object这么简单。
为什么会自动转为Double?
Java的三元运算符会先确定两个分支表达式的「共同类型」,然后把两个分支的结果都转换为这个类型,再返回。对于数值类型来说,它会遵循数值自动提升规则:
- Integer对应的基本类型是
int,Double对应的是double - 根据Java的规则,
int会自动提升为double(因为double的精度更高) - 提升后的
double值会被自动装箱成Double对象,所以最终赋值给Object变量时,结果都是Double类型
你给出的几个例子都符合这个规则:
// 分支2是Integer,但会被提升为double再装箱成Double final Object n = false ? Double.parseDouble("2") : Integer.parseInt("1"); System.out.println(n + " " + n.getClass()); // 输出 "1.0 class java.lang.Double" // 分支1是Integer,同样被提升为double再装箱成Double final Object n = true ? Integer.parseInt("1") : Double.parseDouble("2"); System.out.println(n + " " + n.getClass()); // 输出 "1.0 class java.lang.Double" // 用valueOf也一样,Integer对象会被拆箱为int,再提升为double,最后装箱成Double final Object n = true ? Integer.valueOf("1") : Double.valueOf("2"); System.out.println(n + " " + n.getClass()); // 输出 "1.0 class java.lang.Double"
怎么解决这个问题?
要保留原类型,关键是让三元运算符的结果类型变成Object,而不是触发数值提升,有两种常用方法:
方法1:显式将其中一个分支转为Object
把任意一个分支的结果强制转为Object,这样三元运算符就会把结果类型确定为Object,不会再做数值提升:
// 把Integer分支转为Object,结果保留Integer类型 final Object n = true ? (Object)Integer.valueOf("1") : Double.valueOf("2"); System.out.println(n + " " + n.getClass()); // 输出 "1 class java.lang.Integer" // 把Double分支转为Object,false分支会保留Double类型 final Object n = false ? (Object)Integer.valueOf("1") : Double.valueOf("2"); System.out.println(n + " " + n.getClass()); // 输出 "2.0 class java.lang.Double"
方法2:改用if-else语句
if-else是独立的赋值逻辑,每个分支直接把原类型对象赋值给Object变量,不会有类型提升问题:
final Object n; if (true) { n = Integer.valueOf("1"); } else { n = Double.valueOf("2"); } System.out.println(n + " " + n.getClass()); // 输出 "1 class java.lang.Integer"
备注:内容来源于stack exchange,提问作者Oleg
相关产品推荐
相关产品推荐

