为什么HashMap在扩展AbstractMap时会实现Map?

时间:2012-06-24 04:56:28

标签: java inheritance hashmap

  

可能重复:
  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<K,V>实现Map<K,V>的同时,它还实现了接口Map<K,V>

如果抽象类实现了接口,那么在Map<K,V>类级实现HashMap背后的原因是什么?

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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:6)

在这种特殊情况下,它纯粹是出于文档目的;即向读者清楚说明 Map实施。我很确定这种冗余的成本可以忽略不计。

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

我相信这背后的原因是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() {}
    }