查看 LinkedHashMap 的 JDK 源代码,我注意到这个类被声明为:
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
{...
为什么多余的“ implements Map<K,V>
”(因为HashMap
已经实现Map
)?我无法想象这是一个错字...
谢谢。
查看 LinkedHashMap 的 JDK 源代码,我注意到这个类被声明为:
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”,即使它们已经是隐式的 virtual 。
可能是编码器的错误。
他们可能还想显式地使用接口。由于两次声明它除了额外的击键外没有任何害处,我对此没有任何问题。
我的猜测是允许 LinkedHashMap 提供 Map 接口中声明的方法的自定义实现。这样它就不会继承 HashMap 的所有实现。
它使意图更清晰,因此很明显这是一个具有特定行为的 Map 实现,它恰好是通过扩展 HashMap 创建的,因此可以在某些地方使用,而不是 HashMap .