为什么不允许Java Integer wrapper ==原始double编译同时将原始int分配给Double包装器

ali*_* gh 2 java

以下代码可在Java中正常编译并产生true。我已经读过Java不会一次执行两次转换,就像将一个整数文字值(或变量)分配给Double包装器引用时一样。那么,为什么与使用=运算符相比,它可以编译良好?

double double1 = 3.00;
Integer wInt = new Integer("3");
if(wInt == double1);
Run Code Online (Sandbox Code Playgroud)

rge*_*man 6

与一样的其他数学运算符+,该==运算符对其操作数执行二进制数值提升

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

  1. 如果任何操作数是引用类型,则将其进行拆箱转换(第5.1.8节)。

  2. 扩展基元转换(第5.1.2节)适用于转换一个或两个操作数。

编译器首先将拆箱Integerint,然后将扩大intdouble。如果先进行拆箱,它将同时执行两个操作。

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

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

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

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

  • 数值比较运算<<=>,和>=(§15.20.1)

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

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

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