2015-05-10 92 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]