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

时间:2013-10-10 10:42:43

标签: java core conditional-operator

请你运行以下并解释一下吗?

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

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

2 个答案:

答案 0 :(得分:17)

这一点都不奇怪,虽然它看起来像是一个。行为在JLS §15.25 - Conditional Operator

中指定
  

否则,如果第二个和第三个操作数具有类型   convertible(§5.1.8)到数字类型,然后有几种情况:

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

         

    [...]

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

  •   
     

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

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

答案 1 :(得分:0)

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

Java auto unboxing gotcha

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