2012-08-01 10 views
13

Ya sea en Javadoc, así como el propio código, interfaz Comparador define:¿Por qué no es obligatorio implementar iguales en java.util.Comparator?

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

Pero entonces esto da no hubieron problemas compilating:

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

pero esto:

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

Cómo Está hecho para la interfaz para permitirnos no anular el método?

Respuesta

22

En primer lugar JavaDocs explain claramente que debe implementa este método:

Además, este método puede devolver true sólo si el objeto especificado es también un comparador e impone el mismo orden como este comparador. Por lo tanto, comp1.equals(comp2) implica que sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) para cada referencia de objeto o1 y o2.

Pero más tarde:

en cuenta que es siempre seguro de no anular Object.equals(Object).

¿Cómo es posible no anular equals(), a pesar de que es parte de una interfaz? Porque este método ya está implementado para todos y cada uno de los objetos en Java (in Object class).

La declaración en la interfaz solo sirve para enfatizar la importancia de equals() con respecto a Comparator al agregar una explicación JavaDoc adicional.

BTW si su comparador es apátrico, debe tener solo una instancia de él, en cuyo caso la implementación predeterminada equal() está bien.

+0

había leído la segunda parte, pero quiero decir, se está extendiendo una interace también objeto como un ejemplo newable normal, entonces? ¿O quiere decir que una interfaz conoce qué métodos ya podrían implementarse en algún objeto para que no los fuerce? – Whimusical

+4

@ user1352530 en realidad, tampoco. La interfaz no tiene conocimiento de 'Object'. Pero cuando implementa una interfaz, siempre hereda, directa o indirectamente, de 'Objeto'. Esto significa que ya heredó 'equals()' y otros, por lo que el compilador no se queja. Por otro lado, tenga en cuenta que cuando tiene una instancia de cualquier interfaz, puede llamar a cualquier método 'Object', no a los métodos de esa interfaz en particular. –

+0

¡Buena respuesta, útil! – Whimusical

0

Beczuse cada objeto ya implementa equals().

En realidad especificando equals() de nuevo en la definición de interfaz Comparador logra absolutamente nada, excepto da la oportunidad de documentar el contrato y su relación con compareTo().

Cuestiones relacionadas