为什么LinkedHashMap类实现Map接口?

时间:2015-05-01 11:49:06

标签: java collections

类HashMap实现了Map接口:

public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable

类LinkedHashMap扩展了HashMap,这意味着它应该默认实现Map接口。为什么要明确实现Map接口?

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

4 个答案:

答案 0 :(得分:5)

你是对的:从链接哈希映射中删除Map<K,V>声明不会改变任何东西。虽然LinkedHashMap<K,V>仅仅因为它扩展Map<K,V>而实现HashMap<K,V>,但链接哈希映射派生自常规哈希映射的事实是实现细节,而不是硬性要求。

另一方面,实现Map<K,V>接口是一项基本要求。如果设计人员决定从头开始实现LinkedHashMap<K,V>,或依赖其他一些基类,例如,这个要求就不会消失。链表。

这就是LinkedHashMap<K,V>的设计者明确提到Map<K,V>的原因:如果在某个晚些时候由于重新设计而导致基类发生变化,那么界面将保持不变。

答案 1 :(得分:4)

嗯,这可能是为了文档清晰,它不会给代码增加任何内容。也许是因为LinkedHashMap extends HashMap是一个实现细节,真正重要的是LinkedHashMapMap

答案 2 :(得分:3)

实际上没有区别。在我看来,JDK类中总是如此(List及其子类存在相同的模式)。设计人员可能仍然没有删除这个冗余的实现,以便在例如有人依赖反射来获取有关子类型的信息的情况下不会中断。例如,假设您定义以下内容:

class MyCustomMap<K, V> extends LinkedHashMap<K, V> implements Map<K, V> {

}

然后,下面的代码段会输出带有和不带implements的不同结果:

Class<?>[] interfaces = MyCustomMap.class.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
    System.out.println(interfaces[i]);
}

<强>输出:

  

interface java.util.Map

将定义更改为:

class MyCustomMap<K, V> extends LinkedHashMap<K, V> {

}

然后不会打印任何界面。

答案 3 :(得分:1)

Dici在大多数时候都是对的。

很久以前,一些较小的Java编译器可能会有点困惑,偶尔我添加(到我的代码)应该从父层次结构派生的接口。也许这有助于将接口放在多个位置(对于Java库),但这是纯粹的推测。