查看LinkedHashMap的JDK源代码,我注意到这个类被声明为:
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
{...
为什么冗余的“implements Map<K,V>
”(因为HashMap已经实现了Map)?我无法想象这是一个错字......
感谢。
答案 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。