【问题标题】:Does Interface java.util.Map overrides hashCode() and equals() from Object class接口 java.util.Map 是否覆盖 Object 类中的 hashCode() 和 equals()
【发布时间】:2017-02-05 09:45:18
【问题描述】:

根据java.util.Map 的Java-Doc,hashCodeequals 方法被Object 类覆盖。但是接口不继承自Object类,那么Map接口如何覆盖Object类的方法呢?

【问题讨论】:

  • 简单的回答:不会。
  • 它提供了具体实现的规范,但它本身不能覆盖任何东西,也不能强制执行规范。
  • @HovercraftFullOfEels 我相信不再严格地说是真的。 interface 可以覆盖父 interfacedefault 方法。
  • @AminJ: true,但是这个向后兼容的接口不会覆盖方法
  • @AminJ 严格来说也不是真的。 interface 只能覆盖父 interface 的行为。并且始终可以从继承的 class 调用原始行为 - 这在许多方面不同于覆盖。

标签: java oop object dictionary inheritance


【解决方案1】:

@Override 注解对继承自 Object 的方法有特殊考虑:

引用 Java 语言规范,§9.6.4.4 @Override

如果方法声明使用注解@Override 进行注解,但该方法没有覆盖或实现在超类型中声明的方法,或者不是覆盖等效于Objectpublic 方法,发生编译时错误。

这意味着@Override 可以在实现类中注释将从Object 继承的接口方法,即使接口本身不是从Object 继承的。

它用于防止意外声明与Object 方法冲突的接口方法。

【讨论】:

    【解决方案2】:

    Javadoc 意味着每个实现类都应覆盖方法以实现 Javadoc 中记录的行为。

    【讨论】:

    • s/has to/should/g.
    • 这又没有多大意义,因为Object类被java中的所有类继承,所以为什么我们必须在Map接口中分别提到hashcode和equals方法。
    • 重点不在于方法存在,而在于它们做了什么。
    【解决方案3】:

    那是因为接口不能被实例化为接口。您将其用作接口,但 JVM 引用了实现该接口的 Object 实例,因此作为 Object,它具有 toString、hashCode 和 equals。 (即使您不在实现类中覆盖它们,它们也不会像您期望的那样工作)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 2016-07-12
      • 2020-06-09
      • 1970-01-01
      相关资源
      最近更新 更多