Java: почему WeakHashMap реализует карту, тогда как она уже реализована в AbstractMap?

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

WeakHashMap‹K,V> заявлен как расширяющий AbstractMap‹K,V> и реализующий Map‹K,V>.

Но AbstractMap‹K,V> уже реализует Map‹K,V>. Похоже, что объявление implements избыточно.

По какой причине это было объявлено?


person Oz Molaim    schedule 27.12.2012    source источник
comment
Избыточность документации.   -  person Don Roby    schedule 28.12.2012
comment
См. здесь: stackoverflow.com/questions/5668429/   -  person AFS    schedule 28.12.2012
comment
Вы видели это в документации или в самой реализации?   -  person fge    schedule 28.12.2012
comment
@fge: это в исходном коде Oracle JDK. Это действительно написано как public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>.   -  person T.J. Crowder    schedule 28.12.2012


Ответы (3)


За исключением того, что кто-то может указать на причину, опубликованную где-то в Интернете авторами WeakHashMap в JDK, мы можем только строить догадки. Предполагается, что это улучшает автоматически сгенерированную документацию. Это не влияет на интерфейсы, предоставляемые классом, или на то, как вы его используете.

person T.J. Crowder    schedule 27.12.2012
comment
Сгенерированный javadoc для класса зависит от используемого класса doclet, и бывает, что doclet по умолчанию глубоко запрашивает интерфейсы, поэтому не имеет значения, опускаете ли вы избыточные интерфейсы или нет: они появятся в javadoc. - person fge; 28.12.2012
comment
@fge: я не спорю. :-) Хочется верить, что инженеры Sun (как и раньше) сделали это не просто так. Я не хочу, но я хочу... - person T.J. Crowder; 28.12.2012

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

person cklab    schedule 27.12.2012
comment
Если вы перебазировали его, а новая база не реализовала Map<K,V>, и вы не добавили implements и необходимую сантехнику, это было бы довольно шокирующим изменением. :-) - person T.J. Crowder; 28.12.2012

Это "выглядит" как пропуск. Если вы расширяете класс, вы автоматически реализуете все интерфейсы, реализованные базовым классом (независимо от того, является ли этот базовый класс abstract или нет). Итак, учитывая:

public interface I {}

public class A implements I {}

и вы заявляете:

public class B extends A {}

объявление выше строго эквивалентно

public class B extends A implements I {}

Действительно упущение. Хороший обзор ;)

person fge    schedule 27.12.2012