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 に答える