8

你能运行下面的代码并解释一下吗?

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

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

4

2 回答 2

17

这一点也不奇怪,尽管它看起来很像。该行为在JLS §15.25 - Conditional Operator中指定:

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

  • 如果其中一个操作数是byteor类型Byte,而另一个是shortorShort类型,则条件表达式的类型是 short

    [...]

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

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

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

于 2013-10-10T10:46:27.723 回答
0

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

Java 自动拆箱问题

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

于 2013-10-11T10:25:03.707 回答