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

无论是在Javadoc中还是在代码本身中,Comparator接口都定义了:

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

但是这不会给probs编译:

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

但这样做:

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

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

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

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

但后来:

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

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

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

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

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

实际上,在Comparator接口定义中再次指定equals()除了有机会记录合同及其与compareTo()的关系之外,完全没有任何结果。