在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)强制转换,但双值返回呢?这是一个错误吗?
答案 0 :(得分:4)
https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25指定所有这些规则,它们的行为与观察到的输出完全一致。
整个三元表达式只有一种类型,即返回的内容以及调用System.out.println
的内容。如果您在该规范的表格中查找,您会发现您提到的行中的类型将是double
,int
和{{1}分别。
答案 1 :(得分:3)
原理图:
(true) ? (int)2.5 : 3.5
int double
\ /
double
将double
文字2.5下采样到int
2,然后提升回double
2.0,因为这是条件表达式的类型。
答案 2 :(得分:2)
三元运算符具有常量返回类型。
否则,二进制数字提升(第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
。