9

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

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

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

谢谢。

4

6 回答 6

11

我想这是一种说法

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

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

当然,在这种特殊情况下它是愚蠢的(HashMap 显然总是一个 Map),但类似的情况可能会受益于(并且已经引起)这种约定。

于 2010-08-09T10:00:50.597 回答
3

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

于 2010-08-09T10:21:18.863 回答
1

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

于 2010-08-09T09:57:54.547 回答
0

可能是编码器的错误。

他们可能还想显式地使用接口。由于两次声明它除了额外的击键外没有任何害处,我对此没有任何问题。

于 2010-08-09T09:58:01.947 回答
0

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

于 2010-08-09T10:00:23.220 回答
0

它使意图更清晰,因此很明显这是一个具有特定行为的 Map 实现,它恰好是通过扩展 HashMap 创建的,因此可以在某些地方使用,而不是 HashMap .

于 2010-08-09T10:04:27.953 回答