LinkedHashMap签名

10

查看JDK LinkedHashMap的源代码时,我注意到该类被声明为:

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

为什么会冗余地写上"implements Map<K,V>"(因为HashMap已经实现了Map接口)?我无法想象这是一个打字错误...

谢谢。


HashMap和AbstractMap的情况相同。 - Stephen Denne
6个回答

11

我想这是一种说法

无论HashMap现在或将来实现什么接口,这个类都应该实现Map接口。

如果HashMap的负责人决定它不再实现Map接口,编译器将警告LinkedHashMap的维护者它不再按照他的意图实现Map接口。

当然,在这种特殊情况下(HashMap显然总是一个Map),这很愚蠢。但是类似的情况可能会从中受益(并引起)这样的惯例。


3

这是古老的代码。在 JDK 1.1.6 左右,Javadoc 没有显示继承的接口,所以在派生类中重申它们通常或者确实是必要的,以使 Javadoc 正确工作。它们在 JDK 1.2 中引入,但在此之前,它们作为 1.1.x 的附加组件已经可用。


1

这似乎是一种风格/代码约定:LinkedHashSet具有类似的签名。也许只是为了强调接口的使用。与C++相比,在所有虚函数中编写“virtual”是一个好习惯,即使它们已经隐式地是虚函数。


就像LinkedList一样,我想这使得更容易确定实现了哪些接口。 - Matthew Farwell

0
可能是程序员的错误。
他们可能也想要明确地使用接口。由于声明两次不会造成任何损害,只是多了一些按键,我对此没有意见。

0

我猜测是为了让LinkedHashMap能够提供Map接口中声明的方法的自定义实现。这样它就不会继承HashMap中的所有实现。


2
它无论如何都不会继承HashMap的方法.. 因为它会覆盖它们。 - aioobe

0

这样做可以使意图更加清晰,明确表明这是一个 Map 实现,具有特定的行为,顺便通过扩展 HashMap 来创建,因此可以在某些地方使用它来替代 HashMap。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接