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

Pra*_*nde 15 java inheritance hashmap

可能重复:
Java.util.HashMap - 为什么HashMap扩展了AbstractMap并实现了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类级别实现背后的原因是什么?

根据我的理解HashMapAbstractMap,可以根据需要覆盖从中继承的所有方法HashMap.

Wor*_*mbo 6

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

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


Ste*_*n C 6

在这种特殊情况下,它纯粹用于文档目的; 即向读者表明这一种Map实施方式.我很确定这种冗余的成本可以忽略不计.

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


Baz*_*nga 3

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

public interface MyInterface{
  void a();
  void b();
  void c();
}
Run Code Online (Sandbox Code Playgroud)

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

public abstract class AbstractClass implements MyInterface {
  public void a() {}
  public void c() {}
  public void d() {}
}
Run Code Online (Sandbox Code Playgroud)

因此,我相信,为了明确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() {}
    }
Run Code Online (Sandbox Code Playgroud)

您也可以重写如下:

public class MyClass extends Abstract implements MyInterface {
      public void a() {}
      public void c() {}
      public void b() {}
      public void d() {}
    }
Run Code Online (Sandbox Code Playgroud)

  • 没有理由这样做,如果抽象类实现了一个接口,它不必实现所有方法,扩展抽象类的第一个“非抽象”类 __must__ 必须实现“未实现”方法。 (5认同)