请你运行以下并解释一下吗?
Object o = true ? new Integer(1) : new Double(2.0);
System.out.println(o);
我发现这令人惊讶,因为有人希望打印1而不是1.0
答案 0 :(得分:17)
这一点都不奇怪,虽然它看起来像是一个。行为在JLS §15.25 - Conditional Operator:
中指定否则,如果第二个和第三个操作数具有类型 convertible(§5.1.8)到数字类型,然后有几种情况:
如果其中一个操作数的类型为
byte
或Byte
,另一个是 键入short
或Short
,然后是条件表达式的类型short
。[...]
否则,二进制数字提升(第5.6.2节)将应用于操作数 类型,条件表达式的类型是提升类型 第二和第三个操作数。
请注意,二进制数字促销执行值集转换(第5.1.13节),并且可以执行拆箱转换(第5.1.8节)。
因此,Integer
和Double
类型会打包到各自的原始对应项int
和double
,作为二进制数字提升的过程。然后条件运算符的类型是int
和double
的提升类型,即double
。因此结果是1.0
。当然,最终结果会被装回Double
。
答案 1 :(得分:0)