2013-10-30 30 views
0

據我所知,如果我有兩個longint==運算符測試值的相等性有時會因爲自動裝箱而失效。如何確保==將始終與原語一起作爲平等測試

我需要做些什麼來確保==在處理原語時在每種可能的情況下都能正常工作?

+7

如果兩個操作數都是原始類型,它不會包裝盒... –

+1

AIUI,比較'double'值與'=='很少是個好主意。 –

+0

http://www.javapractices.com/topic/TopicAction.do?Id=197有一些信息 –

回答

7

向後兼容性的要求(和JLS同意),如果你有一個像

double a = .. 
double b = ... 
if (a == b) // condition 

表達這種情況必須解決它自動裝箱自動裝箱作爲後之前的方式相同。這意味着自動裝箱不能也不一定適用於此。

實際上,如果可以使用取消裝箱,自動裝箱從不用於編譯==表達式。

Integer i = 1000; 
int j = 1000; 
System.out.println(i == j); // is true 

在這種情況下拆箱被選擇過拳擊。

+1

「自動裝箱從未用於編譯==表達式」的語句並不完全正確。如果'a'被聲明爲'Object'且'b'被聲明爲'int','a == b'會自動複製'b'到'Integer'。 – ajb

0

法法克你不能用兩個基元獲得拳擊。當你拿(例如)和intIntegerdoubleDouble發生拳擊。拆箱從「框」(Object等價物)中獲取原語,然後將兩個原語與==運算符進行比較,在這種情況下,不能保證它們是相同的。如果你有兩個double但你不會有這個問題。

+0

不,這是錯誤的。如果你比較'double'和'Double',它將取代'Double',而不是'double'。 – ajb

+2

對不起,你完全正確 - 我會立即改變它。 – Voidpaw

2

的JLS(§15.21.1)表示:

如果相等運算符的操作數都是數字型的,或一個是數字型的,另一種是可兌換(§5.1.8)到數字類型,對操作數執行二進制數字提升(第5.6.2節)。

請注意,二進制數值提升執行值集轉換(第5.1.13節)並可能執行拆箱轉換(第5.1.8節)。

所以只有兩個操作數盒裝類型(DoubleInteger等),您所描述的問題發生。操作數類型是否被裝箱取決於如何聲明操作數。如果它是一個變量,字段或參數,則取決於用於聲明名稱的類型;如果是方法調用,則取決於聲明方法時使用的返回類型;如果它是+之類的其他操作的結果,則應該已經將其拆箱;如果已經應用了類型轉換,演員會告訴你類型是什麼。

正如其他人所說,由於四捨五入錯誤,通常不應該使用==來比較雙打或浮點數。