java中的奇怪事情

时间:2016-10-10 20:29:11

标签: java types casting double

在java中发现了一些奇怪的东西。

代码:

System.out.println(System.getProperty("java.version"));
System.out.println((true) ? (int)2.5 : 3.5);
System.out.println((true) ? (int)2.5 : 3);
System.out.println((true) ? (int)2.5 + "" : 3.5);

结果:

1.8.0_40
2.0
2
2

这是什么?为什么只有当false的值不是double或者如果将字符串值添加到true的值时,整数值才会返回?为什么第二行舍入按(int)强制转换,但双值返回呢?这是一个错误吗?

3 个答案:

答案 0 :(得分:4)

https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25指定所有这些规则,它们的行为与观察到的输出完全一致。

整个三元表达式只有一种类型,即返回的内容以及调用System.out.println的内容。如果您在该规范的表格中查找,您会发现您提到的行中的类型将是doubleint和{{1}分别。

答案 1 :(得分:3)

原理图:

(true) ? (int)2.5 : 3.5

         int        double
           \        /
             double

double文字2.5下采样到int 2,然后提升回double 2.0,因为这是条件表达式的类型。

答案 2 :(得分:2)

三元运算符具有常量返回类型。

来自JLS, section 15.25

  

否则,二进制数字提升(第5.6.2节)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型。

这意味着在(true) ? (int)2.5 : 3.5中,2.5转换为int,(向下舍入),然后扩展为double

(true) ? (int)2.5 : 3中,int不需要扩展为double,因为另一方也是int

最后,在(true) ? (int)2.5 + "" : 3.5);中,无法加宽,因为它已经转换为String