2012-08-01 10 views
13

Sia in Javadoc così come il codice stesso, l'interfaccia comparatore definisce:Perché equals non è obbligatorio da implementare in java.util.Comparator?

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

Ma allora questo dà nessuna eccessiva compilating:

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

ma questo:

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

Come è fatto per l'interfaccia per permetterci di non sovrascrivere il metodo?

risposta

22

Innanzitutto JavaDocs explain chiaramente che si dovrebbe implementa questo metodo:

Inoltre, questo metodo può restituire vero solo se l'oggetto specificato è anche un comparatore ed impone lo stesso ordine come questo comparatore. Pertanto, comp1.equals(comp2) implica che sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) per ogni riferimento oggetto o1 e o2.

Ma più tardi:

Si noti che è sempre sicuro di non ignorare Object.equals(Object).

Come è possibile non sovrascrivere equals(), anche se fa parte di un'interfaccia? Perché questo metodo è già implementato per ogni singolo oggetto in Java (in Object class).

La dichiarazione nell'interfaccia è lì solo per sottolineare l'importanza di equals() per quanto riguarda lo Comparator aggiungendo ulteriori spiegazioni JavaDoc.

BTW se il tuo comparatore è stateless dovresti avere solo un'istanza di esso - nel qual caso l'implementazione di default equal() va bene.

+0

Avevo letto la seconda parte, ma voglio dire, è un interaccia che estende anche l'oggetto come una normale istanza di nuova ora? O vuoi dire che un'interfaccia è a conoscenza di quali metodi potrebbero essere già implementati in qualsiasi oggetto, quindi non li forza? – Whimusical

+4

@ user1352530 in realtà, nessuno dei due. L'interfaccia non è a conoscenza di 'Object'. Ma quando si implementa un'interfaccia, si eredita sempre, direttamente o indirettamente, da 'Object'. Questo significa che hai già ereditato 'equals()' e altri, quindi il compilatore non si lamenta. D'altra parte si noti che quando si ha un'istanza di qualsiasi interfaccia, è comunque possibile chiamare qualsiasi metodo 'Object' su di esso, non a malapena i metodi di quella particolare interfaccia. –

+0

Bella risposta, utile! – Whimusical

0

Perché ogni oggetto già implementa equals().

In realtà specificando equals() di nuovo nella definizione dell'interfaccia di Comparatore non si ottiene esattamente nulla se non dando la possibilità di documentare il contratto e la sua relazione con compareTo().

Problemi correlati