【问题标题】:Why is it not necessary to override both methods of interface Comparator in Java为什么Java中不需要重写接口Comparator的两个方法
【发布时间】:2013-10-25 06:42:26
【问题描述】:

我们知道,如果我们想创建一个类的对象,就必须实现接口的所有方法。但是为什么不需要在java中实现接口Comparatorcompare()equals()这两个方法呢?

我同意目的已解决,但即便如此,如果我们覆盖 compare(),为什么不强制覆盖 equals()?

【问题讨论】:

  • @downvoter:你知道正确的答案吗? +1 供应商。这里有一个链接。值得一读。javapractices.com/topic/TopicAction.do?Id=10
  • @sᴜʀᴇsʜᴀᴛᴛᴀ 虽然读得很好,但主要针对Comparable#compareTo(T),而不是Comparator#compare(Object,Object),并且只是简短地说“请注意,如果比较器只比较几个重要字段中的一个,那么比较器是很可能没有与 equals 同步。”
  • 如果您阅读了链接的问题/答案,您应该了解 equals 对 Comparator 的含义 ...以及为什么覆盖它是错误的/毫无意义的。跨度>

标签: java interface comparator


【解决方案1】:

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

如果你定义一个带有 toString() 方法的接口也是一样的。

 public interface ToString {
      public String toString();
 }

 public class SomeClass implements ToString {
     // toString implicitly implemented, because Object defines it
 }

当您查看类时,它会说“实现 ToString”,这是真的,不是吗?

【讨论】:

【解决方案2】:

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

【讨论】:

    【解决方案3】:

    每个对象都隐含一个equals from Object(因为每个对象都是Object的一个子类型)——而且由于它是一个虚拟方法,标准的Java多态性接管了.


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

    ..此方法只有在指定的对象也是一个比较器并且它强加与此比较器相同的顺序时才能返回 true。

    但是,由于 Coverse 必须为真,因此不重载 equals 不会违反新要求。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 2010-10-01
      • 2017-12-19
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      相关资源
      最近更新 更多