19

可能重复:
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

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

4

4 回答 4

6

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

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

于 2012-06-24T05:20:12.427 回答
6

在这种特殊情况下,它纯粹是为了记录目的;即让读者清楚这一个Map实现。我很确定这种冗余的成本可以忽略不计。

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

于 2012-06-24T06:49:38.983 回答
3

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

于 2012-06-24T05:21:17.630 回答
3

我相信这背后的原因是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() {}
    }
于 2012-06-24T05:28:51.210 回答