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

Whi*_*cal 15 java interface comparator

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

 int compare(T o1, T o2);
 boolean equals(Object obj);
Run Code Online (Sandbox Code Playgroud)

但是这样就没有probs编译:

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

但这样做:

 Comparator a = new Comparator() {      
     @Override public boolean equals(Object comparator) {
        //..
     }
 };
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*icz 24

首先,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()实现就可以了.

  • @ user1352530实际上都没有.接口不知道`Object`.但是当你实现一个接口时,你总是直接或间接地从`Object`继承.这意味着你已经继承了`equals()`等等,所以编译器没有抱怨.另一方面请注意,当你有一个任何接口的实例时,你仍然可以在其上调用任何`Object`方法,而不是那个特定接口的方法. (4认同)