条件赋值中的数字推广如何在Java中工作

时间:2016-10-10 18:40:29

标签: java double types

在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的值时,整数值才会返回?这是一个错误吗?

2 个答案:

答案 0 :(得分:4)

specification记录了Java中的数字提升。在第2节中,它表示如果任一操作数的类型为double,则结果为double类型。在这个specification(由@Januson添加)中,提到:

  

条件表达式的类型是第二个 AND 第三个操作数的提升类型

现在,如果我们将这两个文档应用于我们的示例,我们将得到以下结果:

System.out.println(System.getProperty("java.version"));

这是Java的版本(发行版)。这是String

System.out.println((true) ? (int)2.5 : 3.5);

在这种情况下,编译器会查看条件的两个部分并确定数据类型。 (int)2.5是integer,3.5是double。结果将是double。因此,2.5(即2)的整数部分将被转换为double

System.out.println((true) ? (int)2.5 : 3);

在这种情况下,编译器会查看2个整数,因此结果为integer。第一种情况为integer,第二种情况也为integer,因此结果将在integer

System.out.println((true) ? (int)2.5 + "" : 3.5);

在这种情况下,编译器查看第一种情况并采用整数部分,即2.现在,因为此数字附加到字符串,它变为String。结果也将是一个字符串。如果您尝试返回3.5,则会返回String而不是double

答案 1 :(得分:1)

由于三元运算符解析其返回类型的方式。查看其specification以获取更多信息。

第一个表达式返回double,因为2.5首先转换为int 2,但由于第三个参数是double而int可以转换为double,因此整个表达式的返回类型是double 2.0

第二次返回symply int 2因为2.5到int是2而返回类型是int。

第三个首先将2.5转换为2,然后转换为字符串“2”,返回类型为String。