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

时间:2012-08-01 11:11:51

标签: java interface comparator

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

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

2 个答案:

答案 0 :(得分:24)

首先JavaDocs explain显然你应该实现这个方法:

  

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

但后来:

  

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

如果它是界面的一部分,怎么可能不覆盖equals()?因为已经为Java中的每个对象实现了此方法(in Object class)。

界面中的声明仅用于通过添加额外的JavaDoc解释来强调equals()Comparator的重要性。

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

答案 1 :(得分:0)

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

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

相关问题