使用条件运算符的奇怪java行为.这是一个错误吗?

Dim*_*ras 8 java core conditional-operator

你可以在下面运行并解释一下吗?

Object o = true ? new Integer(1) : new Double(2.0);
System.out.println(o);
Run Code Online (Sandbox Code Playgroud)

我发现这令人惊讶,因为有人会期望1打印而不是1.0

Roh*_*ain 17

这根本不是一个惊喜,虽然看起来像是一个.行为在JLS§15.25中指定- 条件运算符:

否则,如果第二个和第三个操作数具有可转换(第5.1.8节)到数字类型的类型,则有几种情况:

  • 如果其中一个操作数是类型byteByte另一个是类型shortShort,则条件表达式的类型是 short.

    [...]

  • 否则,二进制数字提升(第5.6.2节)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型.

请注意,二进制数字提升执行值集转换(第5.1.13节),并可执行拆箱转换(第5.1.8节).

所以这些IntegerDouble类型都被拆箱到各自的原始对应物 - int并且double,作为二进制数字推广的过程.然后条件运算符的类型是int和的提升类型double,即double.因此结果是1.0.当然最后的结果会被重新装箱Double.