为什么 equals 不是在 java.util.Comparator 中实现的强制性要求?

2022-09-04 01:24:29

无论是在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) {
        //..
     }
 };

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


答案 1

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

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

但后来:

请注意,不覆盖 始终是安全的。Object.equals(Object)

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

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

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


答案 2

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

实际上,在 Comparator 接口定义中再次指定 equals() 除了给一个机会来记录合约及其与 compareTo() 的关系之外,什么也做不了。