为什么不必在Java中覆盖接口Comparator的两种方法

我们知道,如果我们想要创建该类的对象,则必须实现接口的所有方法。 但是为什么没有必要在java中实现接口Comparator compare()equals()方法呢?

我同意目的已经解决,但即使那样,如果我们覆盖compare (),为什么不强制重写equals ()?

由于所有类都隐式地扩展了Object ,因此Comparator每个实现都有一个equals方法,因为每个Object都有一个。

如果使用toString()方法定义接口,则相同。

  public interface ToString { public String toString(); } public class SomeClass implements ToString { // toString implicitly implemented, because Object defines it } 

当你看到它所说的“实现ToString”时,这是真的,不是吗?

因为它已经被您可以创建的每个对象上的java.lang.Object覆盖。

每个对象都隐式地具有来自Object的equals (因为每个对象都是Object的子类型) – 并且因为它是一个方法,所以标准Java多态接管。


现在, Comparator#equals 施加了额外的限制 ,这就是它被指定为接口的一部分的原因。

..这个方法只有在指定的对象也是比较器的情况下才能返回true,并且它与该比较器的顺序相同。

但是,由于反过来需要为真,所以不重载equals不会破坏新的要求。

请注意,不要覆盖Object.equals(Object)始终是安全的.. [因为那时不同的比较器实例永远不会相等]。