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