一尘不染

为什么equals在java.util.Comparator中不是必须实现的?

java

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

接口不允许用户重写方法的方法是什么?


阅读 292

收藏
2020-12-03

共1个答案

一尘不染

首先,JavaDocs清楚地解释了您应该实现此方法:

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

但后来:

请注意,始终不要覆盖即可Object.equals(Object)

equals()即使它是接口的一部分,如何也不可以覆盖它?因为已经为Java
中的Object每个对象(类中)实现了此方法。

在接口的声明仅在那里强调的重要性,equals()至于Comparator通过增加额外的Javadoc解释。

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

2020-12-03