使用“==”比较Long对象类型和原始int类型

6

我有一个方法通过调用 resp.getResultCode() 返回一个 Long 对象数据类型。我想将它与 HttpStatus.GONE.value() 进行比较,该方法实际上只返回一个原始 int 值 410。这个 Long 对象会自动拆箱以便与 int 值进行正确的比较吗?

if(resp.getResultCode() == HttpStatus.GONE.value()){
  // code inside..
}

1
是的,int 将会被提升为 long 值。 - Sotirios Delimanolis
4
@SotiriosDelimanolis:那是一个答案,不是评论。 :-) - T.J. Crowder
真的吗?为什么会这样?整数被提升是令人惊讶的。我以为在幕后,长整型会被强制转换为整型。 - user836087
1个回答

11

这里是JLS解释

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

并且

如果操作数的晋升类型是intlong,则执行整数等式测试。

因此,Long被取消包装为long。并且对int应用数字升级,使其成为long。然后它们被比较。

考虑那种情况,其中long会“降级”为int,您将有如下情况

public static void main(String[] args) throws Exception {
    long lvalue = 1234567891011L;
    int ivalue = 1912277059;
    System.out.println(lvalue == ivalue); // false
    System.out.println((int) lvalue == ivalue); // true, but shouldn't
}

那个方法之所以有效,是因为两个数字的低32位相同。降级会剥离长值的上位比特,这就是为什么不应该这样做的原因。 - hfontanez
嗨,我在哪里学习知识才能理解hfontanez关于位和字节的说法?我不是计算机科学专业的人,我学的是音乐。现在我是一名音乐编程员。;-) - user836087
@user836087 这是一个比较广泛的话题。可以从wikipedia关于二进制数开始了解。然后再了解一下Java中原始数值类型的表示方式(如果你将使用Java)。 - Sotirios Delimanolis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接