Java 为什么LinkedHashMap类实现映射接口?

Java 为什么LinkedHashMap类实现映射接口?,java,collections,Java,Collections,类HashMap实现映射接口: public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 公共类HashMap扩展了AbstractMap 实现映射、可克隆、可序列化 类LinkedHashMap扩展了HashMap,这意味着默认情况下它应该实现Map接口。为什么它显式地实现Map接口 public class Linked

类HashMap实现映射接口:

public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
公共类HashMap扩展了AbstractMap
实现映射、可克隆、可序列化
类LinkedHashMap扩展了HashMap,这意味着默认情况下它应该实现Map接口。为什么它显式地实现Map接口

public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
公共类LinkedHashMap
扩展HashMap
实施地图

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

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


这就是为什么
LinkedHashMap
的设计者明确提到
Map
的原因:如果某一天某个基类由于重新设计而发生变化,那么接口将保持不变。

好吧,可能是为了文档的清晰性,它没有给代码添加任何内容。这也可能是因为
LinkedHashMap扩展HashMap
是一个实现细节,真正重要的是要知道
LinkedHashMap
是一个
Map
实际上没有区别。在我看来,JDK类总是如此(对于
List
及其子类,存在相同的模式)。设计者可能还没有删除这个冗余的实现,因此在某些情况下不会有任何中断,例如,有人依赖反射来获取有关子类型的信息。例如,假设您定义了以下内容:

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

}
输出:

接口java.util.Map

将定义更改为:

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

}
类MyCustomMap扩展LinkedHashMap{
}

这样就不会打印任何接口。

Dici在大多数情况下都是正确的


很久以前,一些较小的Java编译器可能会有点困惑,有时我会(在代码中)添加本应派生自父层次结构的接口。也许这也有助于将接口放在多个地方(对于Java库),但这纯粹是猜测。

有趣的想法,但是您是否在没有
实现映射的情况下尝试过同样的方法?你可以模拟一下easily@Dici如果没有
实现
,则输出中不会显示任何接口。Mm,如果有人以这种方式使用反射,那么首先这确实是一个错误。通常,我们应该为(Class c=c.Class;c!=Object.Class;c=c.getSuperclass()){…}
执行类似的操作。如果Map是基于这个原因实施的,那么它将是针对那些依赖于不当使用
getInterfaces
@Radiodef的人的。我同意你的看法。理想情况下,Dici的解释更具说服力。我的观点是显示两个版本之间的代码差异。
class MyCustomMap<K, V> extends LinkedHashMap<K, V> {

}