14

在 Javadoc 以及代码本身中,Comparator 接口定义:

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

但这并没有给出编译的概率:

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

但这确实:

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

它是如何为允许我们不覆盖方法的接口完成的?

4

2 回答 2

23

首先JavaDocs清楚地解释了你应该实现这个方法:

此外,只有当指定的对象也是一个比较器并且它强制执行与此比较器相同的排序时,此方法才能返回 true。因此,comp1.equals(comp2)意味着sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))对于每个对象引用o1o2.

但后来:

请注意,不要覆盖Object.equals(Object).

equals()即使它是接口的一部分,怎么可能不覆盖?因为这个方法已经为 Java 中的每个对象(Object中)实现了。

接口中的声明只是为了通过添加额外的 JavaDoc 解释来强调equals()关于的重要性。Comparator

顺便说一句,如果您的比较器是无状态的,您应该只有一个实例——在这种情况下,默认equal()实现就可以了。

于 2012-08-01T11:17:01.493 回答
0

因为每个对象都已经实现了 equals()。

实际上,在 Comparator 接口定义中再次指定 equals() 只是提供了一个机会来记录合同及其与 compareTo() 的关系。

于 2012-08-01T22:43:01.807 回答