2015-05-10 94 views
0

下面的代码给出错误(与IDEA),而我认为它不应该。无法解析方法equals(java.lang.Long)

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]))效果很好。我认为加运算符会返回一个Long对象。

为什么它看起来像不返回Long对象,如果它不返回Long对象,我们如何能够使用Long c = a[0] + a[1]?或者为什么我们不能使用那样的equals

回答

1

为什么它似乎像它不返回Long对象?

15.18.2. Additive Operators (+ and -) for Numeric Types告诉我们:对操作数进行

二元数值提升。

数字操作数上的加法表达式的类型是其操作数的提升类型。

而且5.6.2. Binary Numeric Promotion告诉我们:

如果任何操作数是参考的类型,它受到取消装箱转换。

这意味着是,Long + Long结果是long,我们不能调用原始类型的方法。

而且我们如何能够使用Long c = a[0] + a[1]如果它不返回Long对象?

对于Long c = a[0] + a[1]long被赋值为装箱。

1

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

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

...或依靠b[1]unboxing成原始类型

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

所有你需要做的是替换这一行:

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

此:

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



编辑:
是的,你说得对 - 等于不能采取多头的总和作为参数,从其他答案我可以看到,这是因为他们是原始值。好知道的是,我们的日常学习:)

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

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

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

你可以使用自动装箱,到加法的结果转换回Long这样的:

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

Long c = (a[0] + a[1]);没有类似的东西,“内部”,即实际上是这样的:

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

 

您也可以简单地取消箱子b[1]

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