无法解析方法等于(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
被赋值包围。
下面的代码给出了错误(使用 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 aLong
object?
对于 Long c = a[0] + a[1]
,long
被赋值包围。