【问题标题】:Numeric Type Promotion with Conditional Expression带条件表达式的数值类型提升
【发布时间】:2016-04-14 03:32:11
【问题描述】:

我在玩 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

有人对此有很好的解释吗?

【问题讨论】:

    标签: java conditional-expressions


    【解决方案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 构造不执行数字提升。实际上不会有任何拳击转换。由于bootrueif 部分将被执行,object2 的值将是new Integer(1)

    【讨论】:

      【解决方案2】:

      三元组必须为两个条件返回相同的类型,因此您的第一个结果 (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)。

      【讨论】:

      • 我英语不好。你能解释一下什么是“二进制数字提升”吗?你能举例解释一下吗?
      • @UnKnown 查看JLS-5.6.2. Binary numeric promotion的链接。
      • 好的。但是为什么 Java 将它们转换为三元运算符呢?有什么原因吗?
      猜你喜欢
      • 2015-11-19
      • 2021-01-28
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多