为什么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
类具有从AbstractMap
inheritance的所有方法,可以根据需要由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的抽象方法的代码。