我认为jls中描述的转换是根据优先级排序的。 首先要优先考虑。
因此,我解决了Boxing
的优先级高于Unboxing
的问题。我决定检查这个假设。
研究以下代码:
public class BoxingUnboxingPriority {
public static void main(String [] args){
int sn = 1000;
Integer isn1= new Integer(sn);
System.out.println(sn == isn1 );
}
}
出:
true
什么是拳击?只是new Integer(primitiveInt)
我稍微更改了代码
int sn = 1000;
Integer isn1= new Integer(sn);
Integer isn2= new Integer(sn);
System.out.println(isn1 == isn2 );
out:
false
因此我犯了错误。
请澄清这个问题。
答案 0 :(得分:2)
<强> 15.21.1。数值等式算子==和!=
如果等于运算符的操作数都是数字类型,或者一个是数值类型而另一个是可转换的(§5.1.8)为数字类型,则对操作数执行二进制数字提升({{3 }})。
所以:
Integer o = 1;
int i = 1;
boolean b = o == i;
......相当于:
boolean b = o.intValue() == i;
如果两者都是 Integer 类型,则它们都不是原始数字类型 - 它们都是§5.6.2。
答案 1 :(得分:1)
当您使用包含Wrapper对象的基元时,该包装器对象将被取消装箱,然后将应用该操作。
在第一种情况下,当您将sn
与isn1
进行比较时,isn1
将被取消装箱,并且会比较该值。所以你得到true
。
在第二种情况下,isn1
,isn2
是两个不同的对象,因此==
运算符将提供false
答案 2 :(得分:0)
我认为jls中描述的转换是根据优先级进行排序的。
这是不正确的。 JLS没有谈及&#34;优先事项&#34;转换。这不是一个公认的概念。
事实上,可以应用的转换是根据每个运营商的具体情况记录的,依此类推。因此,JLS 15.21.1表示数字类型的==
或!=
会导致&#34;二进制数字促销&#34;两个操作数。 JLS 5.6.2表示二进制数字促销包含&#34;拆箱转换&#34; (5.1.8)后跟&#34;扩大原始转换&#34; (5.1.2),最后&#34;价值集转换&#34; (5.1.3)。
相比之下,JLS 15.21.3表示使用==
或!=
比较两个引用时,不会进行任何促销或转化。
(事实上,一个常见的Java初学者错误就是使用==
来比较两个Integer
对象而不是equals(Object)
方法。可能这就是&#34;问题& #34;你正在试图测试你对...的理解。)
答案 3 :(得分:0)
int sn=1000;
Integer isn1=new Integer(sn);
System.out.println(sn == isn1 );
将转换为
System.out.println(sn == isn1.intValue());
在将原语与包装器进行比较时,首先将包装器对象取消装箱然后进行比较。 包装器对象intValue()返回int,因为原始比较结果为true。
Integer isn1= new Integer(sn);
Integer isn2= new Integer(sn);
System.out.println(isn1 == isn2 );
//将两个不同的对象比较为假。