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

可能重复:
Java.util.HashMap – 为什么HashMap扩展了AbstractMap并实现了Map?

在java中实现HashMap我们需要实现Map

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

public class HashMap extends AbstractMap implements Map, Cloneable, Serializable

同时我看到public abstract class AbstractMap实现Map它还实现了接口Map

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

根据我的理解, HashMap类具有从AbstractMapinheritance的所有方法,可以根据需要由HashMap覆盖。

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

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

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

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

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

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