LinkedHashMap签名

时间:2010-08-09 09:50:27

标签: java collections linkedhashmap

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

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

为什么冗余的“implements Map<K,V>”(因为HashMap已经实现了Map)?我无法想象这是一个错字......

感谢。

6 个答案:

答案 0 :(得分:12)

我想这是一种说法

  

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

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

当然,在这种特殊情况下它很愚蠢(HashMap显然总是一张地图),但类似的情况可能会受益于(并且已经产生)这种惯例。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

看起来像样式/代码约定:LinkedHashSet具有类似的签名。也许只是强调界面使用。与c ++相比,最好用所有虚函数编写“虚拟”,即使它们已经是隐式虚拟的。

答案 3 :(得分:0)

编码员可能会出错。

他们可能也想要明确地使用接口。由于声明它两次并没有超出额外的击键,我没有问题。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

它使意图更加清晰,因此很明显这是一个Map实现,具有特定的行为,顺便碰巧通过扩展HashMap创建,从而能够在某些地方使用,到位一个HashMap。