为什么不允许java Integer wrapper==primitive double编译,而将primitive int分配给double wrapper

为什么不允许java Integer wrapper==primitive double编译,而将primitive int分配给double wrapper,java,Java,下面的代码编译得很好,在java中为true。 我已经读到java不会同时进行两次转换,比如将int文本值(或变量)赋给Double包装器引用时。 那么,为什么与使用=运算符相比,它编译得很好呢 double double1 = 3.00; Integer wInt = new Integer("3"); if(wInt == double1); 与其他数学运算符(如+)一样,==运算符对其操作数执行操作 当运算符将二进制数字提升应用于一对操作数(每个操作数必须表示可转换为数字类型的值)时,以

下面的代码编译得很好,在java中为true。 我已经读到java不会同时进行两次转换,比如将int文本值(或变量)赋给Double包装器引用时。 那么,为什么与使用=运算符相比,它编译得很好呢

double double1 = 3.00;
Integer wInt = new Integer("3");
if(wInt == double1);

与其他数学运算符(如
+
)一样,
==
运算符对其操作数执行操作

当运算符将二进制数字提升应用于一对操作数(每个操作数必须表示可转换为数字类型的值)时,以下规则依次适用:

  • 如果任何操作数是引用类型,则它将进行取消装箱转换(§5.1.8)

  • 加宽基元转换(§5.1.2)用于转换一个或两个操作数

  • 编译器首先将
    整数
    解封为
    int
    ,然后将
    int
    扩展为
    双精度
    。如果先取消装箱,则它将执行这两个操作

    Java将为许多运算符隐式执行这两种转换:

    对某些运算符的操作数执行二进制数字提升:

    • 乘法运算符
      *
      /
      %
      (§15.17)

    • 数字类型的加减运算符
      +
      -
      (§15.18.2)

    • 数值比较运算符
      =
      (§15.20.1)

    • 数值相等运算符
      ==
      =(§15.21.1)

    • 整数位运算符
      &
      ^
      |
      (§15.22.1)

    • 在某些情况下,条件运算符
      ?:(§15.25)


    这只是@ModusTollens的一个可能的优化副本,这个问题不包括拆箱和加宽。@user1133275什么的优化?所以你的解释是,只有在第一次拆箱时才允许“两次转换”,而不是相反的方式?(装箱然后转换)@AndyTurner我认为在底部的引号中包含
    ?:
    就足够了。@是的,这是JLS中的引号明确指出的。转换是“按顺序”进行的。它实际上可能总共进行四次转换。示例:如果表达式是
    Byte+Short
    ,则它将执行
    Byte→ 字节
    (unbox),
    字节→ int
    (加宽),
    短→ short
    (取消装箱)和
    short→ int
    (加宽)。