具有条件表达式的数字类型促销

时间:2016-01-09 13:44:26

标签: java conditional-expressions

我正在玩弄java,我发现了一些东西。它最好显示在这里:

boolean boo = true;

Object object1 = boo ? new Integer(1) : new Double(2.0);

Object object2;
if (boo)
    object2 = new Integer(1);
else
    object2 = new Double(2.0);

System.out.println(object1);
System.out.println(object2);

我希望这两者是相同的,但这是印刷品:

1.0
1

有没有人对此有好的解释?

2 个答案:

答案 0 :(得分:3)

三元组必须为这两种条件返回相同的类型,因此您的第一个结果(Integer提升为双倍以匹配2.0。另见,

Object object1 = boo ? new Integer(1) : new Double(2.0);
System.out.println(object1.getClass().getName());

这在JLS-15.25.2 - Numeric Conditional Expressions记录,其中(部分)

  

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

     

请注意,二进制数字促销会执行值集转换(§5.1.13),并可能会执行拆箱转换(§5.1.8)。

答案 1 :(得分:1)

JLS section 15.25有一个table,根据其操作数的类型汇总条件表达式的类型。对于IntegerDouble的情况,表格表明该类型是将二进制数字提升应用于参数(§15.25.2

的结果
  

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

     

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

引用binary numeric promotion

  

如果任何操作数属于引用类型,则进行拆箱转换(第5.1.8节)。   
...
  如果任一操作数的类型为double,则另一个操作数将转换为double。

这就是

发生的事情
Object object1 = boo ? new Integer(1) : new Double(2.0);
  • 引用类型new Integer(1)已取消装箱到原始int 1。
  • 引用类型new Double(2.0)已取消装入原始double 2.0。
  • 执行二进制数字促销,结果类型为double。在这种情况下,由于bootrue,原始int 1将被提升为double为1.0。
  • 由于您将结果存储在Object中,原始结果将被装入其包装类型中。

对于

的情况
Object object2;
if (boo)
    object2 = new Integer(1);
else
    object2 = new Double(2.0);

if / else构造不执行数字提升。实际上不会有任何拳击转换。由于bootrue,因此if部分将被执行,而object2将具有值new Integer(1)