无法解析方法equals(java.lang.Long)

时间:2015-05-10 14:56:01

标签: java equals

以下代码给出了错误(使用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]))。我以为plus运算符会返回一个Long对象。

为什么它似乎没有返回Long对象,如果它不返回Long对象,我们如何能够使用Long c = a[0] + a[1]?或者为什么我们不能像这样使用equals

4 个答案:

答案 0 :(得分:1)

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

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

...或依赖于unboxing b[1]的原始类型

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

答案 1 :(得分:1)

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

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

为此:

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



修改:
是的,你是对的 - 等于不能将长的总和作为参数,从其他答案我可以看出它是因为它们是原始值。很高兴知道,我们每天都学习:)

答案 2 :(得分: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]

答案 3 :(得分: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]

对于longinput { width: 30%; } 由作业装箱。