以下代码给出了错误(使用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
?
答案 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]
?
对于long
,input {
width: 30%;
}
由作业装箱。