Подтвердить что ты не робот

Почему HashMap реализует Map, если он расширяет AbstractMap?

Возможный дубликат:
Java.util.HashMap — почему HashMap расширяет AbstractMap и реализует карту?

В 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> at HashMap?

В соответствии с моим пониманием класс HashMap имеет все методы, унаследованные от AbstractMap, которые могут быть переопределены HashMap в соответствии с требованием.

4b9b3361

Ответ 1

Я считаю, что причиной этого является абстрактный класс в 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() {}
    }

Ответ 2

Вероятно, это просто, чтобы сделать вещи более очевидными. Вы можете прямо видеть из кода этого единственного класса, что HashMap реализует интерфейс Map. Да, он уже расширяет AbstractMap, но, вероятно, только рассмотрел деталь реализации.

Нет ничего плохого в реализации интерфейсов. Это не меняет способ компиляции кода, но это определенно помогает, потому что вы видите его немедленно. Вам не нужно подниматься вверх по иерархии классов или сначала загружать документы API.

Ответ 3

В данном конкретном случае это чисто для целей документации; чтобы дать читателю понять, что реализация a Map. Я почти уверен, что в этом бит избыточности есть незначительная стоимость.

(И да, ваше понимание правильное.)

Ответ 4

"Осуществляет карту" является необязательным и, как правило, помогает людям, читающим код, который HashMap реализует методы интерфейса карты, а также абстрактные методы AbstractMap.