2013-08-29 117 views
15

我是高級解決方案架構師,但是我最近偶然發現讓我停下來思考一個問題...在Java中比較對象和INT 7

對我來說,下面的代碼應該總是觸發一個錯誤,但當我的一位同事問我爲什麼Eclipse沒有顯示它時,我無法回答任何問題。

class A { 
    public static void main(String... args) { 
     System.out.println(new Object() == 0); 
    } 
} 

我調查,發現與源1.6級的確它拋出一個錯誤:

incomparable types: Object and int 

但是現在在1.7它編譯OK。

請問有什麼新功能保證這種行爲?

回答

9

你是什麼意思「什麼新功能確保這種行爲?」 ? 1.7正在解決1.6中存在的問題。 new Object() == 0應該有從來沒有產生了一個錯誤,並且總是導致自動裝箱觸發。

根本就沒有任何理由

Object a= 5 ; 

是正確的,而不是表達

a == 3 

甚至

a == 5 

這是非常奇怪,恕我直言,矛盾與語言規範本身。

從一個動態的角度,雖然a == 5仍計算爲false(Integer)a == 5甚至(int)a == 5評估爲true。原因是autounboxing被設計爲永遠不會產生ClassCastException s,因此僅適用於包裝類型,靜態。後兩種情況是明確表演,因此ClassCastException一般是允許的。

+0

你的意思是它現在與'new Object()== null'等價,並且'new Object()== 2'仍然會觸發一個錯誤? –

+0

它應該或多或少等同於new Object()== new Integer(0)'(或'New Integer(2)')。它不應該是一個錯誤,並且總是爲'false',因爲新的'Object'不能和Integer對象是同一個對象。 – ajb

+5

@MartijnCourteaux不是。它相當於'new Object()== Integer.valueOf(0)'和'new Object()== Integer.valueOf(2)'。當然,兩者都會產生錯誤。 –