无法解析方法等于(java.lang.Long)

Cannot resolve method equals(java.lang.Long)

下面的代码给出了错误(使用 IDEA),而我认为它不应该。

Long[] a = {0L, 0L};
Long[] b = {1L, 1L};
if((a[0] + a[1]).equals(b[1]))
    System.out.println("Equal");

cannot resolve method equals(java.lang.Long)。但它适用于 if(a[0].equals(b[0]))。我认为加运算符会 return 一个 Long 对象。

为什么它看起来不像 return 一个 Long 对象,如果它不是 return 一个,我们如何使用 Long c = a[0] + a[1]长对象?或者为什么我们不能那样使用 equals

a[0] + a[1] 作为基本类型添加,而不是 autoboxed(基本类型没有方法,因此编译时错误)。您需要将它们显式包装到一个对象中:

(new Long(a[0] + a[1])).equals(b[1])

...或者依赖b[1]unboxing变成原始类型

a[0] + a[1] == b[1]

您需要做的就是替换这一行:

if((a[0] + a[1]).equals(b[1]))

为此:

if(a[0] + a[1] == b[1])



编辑:
是的,你是对的——equals 不能将 longs 的总和作为参数,从其他答案我可以看出这是因为它们是原始值。很高兴知道,我们每天都在学习 :)

(a[0] + a[1])

结果为 原始类型 long 而不是引用类型 java.lang.Long.

如果您尝试使用原始类型的成员,则会导致编译时错误。

您可以使用自动装箱,将加法结果转换回 Long,如下所示:

((Long)(a[0] + a[1])).equals(b[1])

Long c = (a[0] + a[1]); 做了类似 "internally" 的事情,即实际上是这样工作的:

Long c = (Long)((long)a[0] + (long)a[1]);

您也可以直接拆箱 b[1]:

(a[0] + a[1]) == b[1]

Why does it seem like it doesn't return a Long object?

15.18.2. Additive Operators (+ and -) for Numeric Types 告诉我们:

Binary numeric promotion is performed on the operands.

The type of an additive expression on numeric operands is the promoted type of its operands.

5.6.2. Binary Numeric Promotion 告诉我们:

If any operand is of a reference type, it is subjected to unboxing conversion.

这意味着 Long + Long 的结果是 long 并且我们不能在基本类型上调用方法。

And how are we able to use Long c = a[0] + a[1] if it doesn't return a Long object?

对于 Long c = a[0] + a[1]long 被赋值包围。