使用条件运算符的奇怪java行为。 这是一个错误吗?
你可以运行下面的解释吗?
Object o = true ? new Integer(1) : new Double(2.0); System.out.println(o);
我发现这令人惊讶,因为有人会期望打印1而不是1.0
这根本不足为奇,虽然它看起来像是一个。 行为在JLS§15.25中指定- 条件运算符 :
否则,如果第二个和第三个操作数具有可转换的类型(第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
。
这是昨天发表在DZone上的一篇文章:
Java自动拆箱问题
有趣的是,示例代码看起来很相似……