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