可能重复:
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
覆盖。
答案 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() {}
}