Подпись LinkedHashMap - PullRequest
       9

Подпись LinkedHashMap

9 голосов
/ 09 августа 2010

Глядя на исходный код JDK для LinkedHashMap, я заметил, что этот класс объявлен как:

 public class LinkedHashMap<K,V>
       extends HashMap<K,V>
       implements Map<K,V>
   {...

почему избыточный "implements Map<K,V>" (поскольку HashMap уже реализует Map)? Я не могу представить, что это опечатка ...

Спасибо.

Ответы [ 6 ]

12 голосов
/ 09 августа 2010

Полагаю, это способ сказать

Независимо от того, какие интерфейсы реализует HashMap (сейчас или в будущем), этот класс должен реализовывать интерфейс Map.

Если кто-то, ответственный за HashMap, решит, что он больше не должен реализовывать интерфейс Map, компилятор предупредит сопровождающего LinkedHashMap о том, что он больше не реализует интерфейс Map, как он предполагал.

OfКонечно, в данном конкретном случае это глупо (HashMap, очевидно, всегда будет картой), но подобные ситуации могут выиграть (и породили) такое соглашение.

3 голосов
/ 09 августа 2010

Это древний код.До некоторой степени около JDK 1.1.6 или около того, Javadoc не показывал унаследованные интерфейсы, поэтому было обычным или действительно необходимым повторять их в производных классах, чтобы заставить Javadoc работать правильно.Они были представлены в JDK 1.2, но были доступны задолго до этого как дополнение к 1.1.x.

1 голос
/ 09 августа 2010

Это похоже на соглашение стиля / кода: LinkedHashSet имеет похожую подпись.Может быть, это просто подчеркнуть использование интерфейса.Сравните с c ++, где рекомендуется писать «виртуальные» со всеми виртуальными функциями, даже если они уже неявно виртуальные.

0 голосов
/ 09 августа 2010

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

0 голосов
/ 09 августа 2010

Я предполагаю, что LinkedHashMap может предоставлять пользовательскую реализацию методов, объявленных в интерфейсе Map.Таким образом, он не унаследует все реализации от HashMap.

0 голосов
/ 09 августа 2010

Может быть ошибка со стороны кодера.

Возможно, они также хотели сделать использование интерфейса явным.Поскольку его повторное объявление не наносит вреда, кроме дополнительных нажатий клавиш, у меня с этим нет проблем.

...