查看JDK LinkedHashMap的源代码时,我注意到该类被声明为:
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
{...
为什么会冗余地写上"implements Map<K,V>
"(因为HashMap
已经实现了Map
接口)?我无法想象这是一个打字错误...
谢谢。
查看JDK LinkedHashMap的源代码时,我注意到该类被声明为:
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
{...
为什么会冗余地写上"implements Map<K,V>
"(因为HashMap
已经实现了Map
接口)?我无法想象这是一个打字错误...
谢谢。
我想这是一种说法
无论HashMap现在或将来实现什么接口,这个类都应该实现Map接口。
如果HashMap的负责人决定它不再实现Map接口,编译器将警告LinkedHashMap的维护者它不再按照他的意图实现Map接口。
当然,在这种特殊情况下(HashMap显然总是一个Map),这很愚蠢。但是类似的情况可能会从中受益(并引起)这样的惯例。
这是古老的代码。在 JDK 1.1.6 左右,Javadoc 没有显示继承的接口,所以在派生类中重申它们通常或者确实是必要的,以使 Javadoc 正确工作。它们在 JDK 1.2 中引入,但在此之前,它们作为 1.1.x 的附加组件已经可用。
这似乎是一种风格/代码约定:LinkedHashSet具有类似的签名。也许只是为了强调接口的使用。与C++相比,在所有虚函数中编写“virtual”是一个好习惯,即使它们已经隐式地是虚函数。
我猜测是为了让LinkedHashMap能够提供Map接口中声明的方法的自定义实现。这样它就不会继承HashMap中的所有实现。
这样做可以使意图更加清晰,明确表明这是一个 Map 实现,具有特定的行为,顺便通过扩展 HashMap 来创建,因此可以在某些地方使用它来替代 HashMap。