繁体   English   中英

primitive == Wrapper转换为primitive == primitive或Wrapper == Wrapper?

[英]primitive == Wrapper converts to primitive == primitive or Wrapper == Wrapper?

我想jls中描述的转换是根据优先级排序的。 首先要优先考虑。

JLS

因此,我解决了BoxingUnboxing更优先。 我决定检查这个假设。

研究以下代码:

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

因此我犯了错误。

请澄清这个问题。

相关部分

15.21.1。 数值等式算子==和!=

如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第5.1.8节 )是数字类型,则对操作数执行二进制数字提升(第5.6.2节 )。

所以:

Integer o = 1;
int i = 1;
boolean b = o == i;

......相当于:

boolean b = o.intValue() == i;

如果两者都是Integer类型,则它们都不是原始数字类型 - 它们都是对象引用

当您使用包含Wrapper对象的基元时,该包装器对象将被取消装箱,然后将应用该操作。

在第一种情况下,当您将snisn1进行比较时, isn1将被取消装箱并且将比较该值。 所以,你得true

在第二种情况下, isn1isn2是两个不同的对象,所以==运算符将给出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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM