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