2012-08-01 75 views
13

無論是在的Javadoc以及代碼本身,比較接口定義:爲什麼equals不是強制在java.util.Comparator中實現的?

int compare(T o1, T o2); 
boolean equals(Object obj); 

但後來這給沒有probs compilating:

Comparator a = new Comparator() {  
    @Override public int compare(Object o1, Object o2) { 
     //.. 
    } 
}; 

但這:

Comparator a = new Comparator() {  
    @Override public boolean equals(Object comparator) { 
     //.. 
    } 
}; 

如何它的界面允許我們不要重寫方法嗎?

回答

22

首先JavaDocs explain清楚,你應該實現此方法的:

此外,僅當指定的對象也是一個比較,並且強行相同的順序,因爲這比較這種方法可以返回true。因此,comp1.equals(comp2)意味着對於每個對象參考o1o2sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))

但後來:

注意,它始終是安全的不覆蓋Object.equals(Object)

即使它是接口的一部分,如何不覆蓋equals()?因爲此方法已針對Java中的每個對象(in Object class)實施。

接口中的聲明只是爲了強調equals()關於Comparator的重要性,通過添加額外的JavaDoc解釋。

順便說一句,如果你的比較器是無狀態的,你應該只有它的一個實例 - 在這種情況下,默認的equal()實現就好了。

+0

我已經讀過第二部分,但我的意思是,是一個interace擴展對象就像一個正常的newable實例呢?或者你的意思是一個接口意識到什麼方法可以在任何對象中實現,因此它不會強制它們? – Whimusical 2012-08-01 11:28:49

+4

@ user1352530其實也沒有。接口不知道「對象」。但是當你實現一個接口時,你總是直接或間接地從'Object'繼承。這意味着你已經繼承了'equals()'等,所以編譯器不會抱怨。另一方面請注意,當你有任何接口的實例時,你仍然可以調用它的任何'Object'方法,而不是那個特定接口的方法。 – 2012-08-01 11:31:12

+0

很好的答案,很有用! – Whimusical 2012-08-01 16:04:05

0

將每個對象都已經實現equals()。

實際上,在Comparator接口定義中再次指定equals()除了給出機會記錄契約及其與compareTo()的關係外,完全沒有任何作用。

相關問題