據我所知,如果我有兩個long
或int
,==
運算符測試值的相等性有時會因爲自動裝箱而失效。如何確保==將始終與原語一起作爲平等測試
我需要做些什麼來確保==
在處理原語時在每種可能的情況下都能正常工作?
據我所知,如果我有兩個long
或int
,==
運算符測試值的相等性有時會因爲自動裝箱而失效。如何確保==將始終與原語一起作爲平等測試
我需要做些什麼來確保==
在處理原語時在每種可能的情況下都能正常工作?
向後兼容性的要求(和JLS同意),如果你有一個像
double a = ..
double b = ...
if (a == b) // condition
表達這種情況必須解決它自動裝箱自動裝箱作爲後之前的方式相同。這意味着自動裝箱不能也不一定適用於此。
實際上,如果可以使用取消裝箱,自動裝箱從不用於編譯==表達式。
Integer i = 1000;
int j = 1000;
System.out.println(i == j); // is true
在這種情況下拆箱被選擇過拳擊。
「自動裝箱從未用於編譯==表達式」的語句並不完全正確。如果'a'被聲明爲'Object'且'b'被聲明爲'int','a == b'會自動複製'b'到'Integer'。 – ajb
的JLS(§15.21.1)表示:
如果相等運算符的操作數都是數字型的,或一個是數字型的,另一種是可兌換(§5.1.8)到數字類型,對操作數執行二進制數字提升(第5.6.2節)。
請注意,二進制數值提升執行值集轉換(第5.1.13節)並可能執行拆箱轉換(第5.1.8節)。
所以只有兩個操作數盒裝類型(Double
,Integer
等),您所描述的問題發生。操作數類型是否被裝箱取決於如何聲明操作數。如果它是一個變量,字段或參數,則取決於用於聲明名稱的類型;如果是方法調用,則取決於聲明方法時使用的返回類型;如果它是+
之類的其他操作的結果,則應該已經將其拆箱;如果已經應用了類型轉換,演員會告訴你類型是什麼。
正如其他人所說,由於四捨五入錯誤,通常不應該使用==
來比較雙打或浮點數。
如果兩個操作數都是原始類型,它不會包裝盒... –
AIUI,比較'double'值與'=='很少是個好主意。 –
http://www.javapractices.com/topic/TopicAction.do?Id=197有一些信息 –