【问题标题】:Why does HashMap implement Map if it extends AbstractMap? [duplicate]HashMap扩展AbstractMap为什么还要实现Map? [复制]
【发布时间】:2012-06-25 20:46:44
【问题描述】:

可能重复:
Java.util.HashMap — why HashMap extends AbstractMap and implement Map?

在java中实现HashMap<K,V>需要实现Map<K,V>

但是,当我在 java 类中进行更多调试时,似乎...... java 将HashMap 类定义如下。

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

同时我看到public abstract class AbstractMap&lt;K,V&gt;实现了Map&lt;K,V&gt;它也实现了接口Map&lt;K,V&gt;

如果抽象类实现了接口,那么在HashMap类级别实现Map&lt;K,V&gt;的原因是什么?

据我了解,HashMap 类具有从AbstractMap 继承的所有方法,可以根据要求由HashMap 覆盖。

【问题讨论】:

  • 也许当它在 Java 1.2 中设计时,即使超类已经实现了 IMO,类也需要实现接口。
  • this。它指出了类似的情况
  • 是的......它应该作为副本关闭。
  • 这不是说明所有的方法都在子类中显式定义了吗?
  • @user845279 - 不。因为它没有。

标签: java inheritance hashmap


【解决方案1】:

它可能只是为了让事情更明显。基本上可以从那个单一类的代码中直接看出HashMap实现了Map接口。是的,它已经扩展了AbstractMap,但这可能只是一个实现细节。

再次实现接口并没有错。这不会改变代码的编译方式,但肯定会有所帮助,因为您可以立即看到它。您不必先爬上类层次结构或加载 API 文档。

【讨论】:

    【解决方案2】:

    在这种特殊情况下,它纯粹是出于文档目的;即让读者清楚地知道这个 一个Map 实现。我很确定这种冗余的成本可以忽略不计。

    (而且,是的,你的理解是正确的。)

    【讨论】:

      【解决方案3】:

      我相信这背后的原因是 Java 中的抽象类不需要声明/实现接口中的所有方法。 因此

      public interface MyInterface{
        void a();
        void b();
        void c();
      }
      

      接口的以下抽象实现是有效的。

      public abstract class AbstractClass implements MyInterface {
        public void a() {}
        public void c() {}
        public void d() {}
      }
      

      因此,我相信为了明确HashMap 实现抽象类未实现的方法,它显示实现接口Map,而这样做是完全可选的,因为抽象类的任何实现都需要在抽象类或派生基类中实现所有方法.. 因此,在上面的示例中,抽象类的有效实现是

      public class MyClass extends Abstract{
            public void a() {}
            public void c() {}
            public void b() {}  //if you dont implement this, compile error
            public void d() {}
          }
      

      你也可以改写如下:

      public class MyClass extends Abstract implements MyInterface {
            public void a() {}
            public void c() {}
            public void b() {}
            public void d() {}
          }
      

      【讨论】:

      • 没有理由这样做,如果抽象类实现了一个接口,它不必实现所有方法,第一个扩展抽象类的“非抽象”类必须 必须实现“未实现”的方法。
      【解决方案4】:

      “实现 Map”是可选的,通常用于帮助人们阅读 HashMap 实现 Map 的接口方法以及 AbstractMap 的抽象方法的代码。

      【讨论】:

        猜你喜欢
        • 2011-01-18
        • 1970-01-01
        • 2015-07-11
        • 1970-01-01
        • 2013-09-04
        • 1970-01-01
        • 2013-03-06
        • 2011-08-07
        • 2011-02-08
        相关资源
        最近更新 更多