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

你可以运行下面的解释吗?

Object o = true ? new Integer(1) : new Double(2.0); System.out.println(o); 

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

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

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

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

    […]

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

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

因此, IntegerDouble类型被拆箱到它们各自的原始对应物 – intdouble ,作为二进制数字提升的过程。 然后条件运算符的类型是intdouble的提升类型,它是double 。 因此结果是1.0 。 当然最终的结果会被装回Double

这是昨天发表在DZone上的一篇文章:

Java自动拆箱问题

有趣的是,示例代码看起来很相似……