[英]primitive == Wrapper converts to primitive == primitive or Wrapper == Wrapper?
我想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 );
出:
false
因此我犯了错误。
请澄清这个问题。
当您使用包含Wrapper对象的基元时,该包装器对象将被取消装箱,然后将应用该操作。
在第一种情况下,当您将sn
与isn1
进行比较时, isn1
将被取消装箱并且将比较该值。 所以,你得true
。
在第二种情况下, isn1
, isn2
是两个不同的对象,所以==
运算符将给出false
我想jls中描述的转换是根据优先级排序的。
那是不对的。 JLS没有谈论转换的“优先级”。 这不是一个公认的概念。
实际上,可以应用的转换是根据每个运算符的具体情况记录的,依此类推。 因此, JLS 15.21.1表示==
或!=
对于数字类型导致两个操作数的“二进制数字提升”。 JLS 5.6.2表示二进制数字提升包括“拆箱转换”( 5.1.8 ),然后是“加宽基元转换”( 5.1.2 ),最后是“值集转换”( 5.1.3 )。
相比之下, JLS 15.21.3表示当使用==
或!=
比较两个引用时,不会发生促销或转换。
(事实上,一个常见的Java初学者错误是使用==
来比较两个Integer
对象而不是equals(Object)
方法。可能那就是你正在考虑的“问题”是试图测试你对...的理解。 。)
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 );
//将两个不同的对象比较错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.