【问题标题】:Java: why does WeakHashMap implement Map whereas it is already implemented by AbstractMap? [duplicate]Java:为什么 WeakHashMap 实现了 Map,而 AbstractMap 已经实现了它? [复制]
【发布时间】:2012-12-27 22:48:36
【问题描述】:

可能重复:
Java.util.HashMap — why HashMap extends AbstractMap and implement Map?
Why would both a parent and child class implement the same interface?

WeakHashMap 被声明为扩展 AbstractMap 并实现 Map

但是 AbstractMap 已经实现了 Map。看起来implements 声明是多余的。

宣布它的原因是什么?

【问题讨论】:

  • 文档冗余。
  • 您是在文档中还是在实现本身中看到了这一点?
  • @fge:它在 Oracle JDK 的源代码中。真的写成public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>

标签: java collections weakhashmap


【解决方案1】:

除非有人能够指出 JDK 中 WeakHashMap 的作者在网上某处发布的原因,否则我们只能推测。推测是它改进了自动生成的文档。它对类公开的接口或您如何使用它没有影响。

【讨论】:

  • 为一个类生成的 javadoc 依赖于所使用的 doclet 类,而且碰巧默认的 doclet 对接口的查询是“深度”的,所以不管你是否省略冗余接口:它们会出现在 javadoc 中。
  • @fge:我没有异议。 :-) 我想相信 Sun 工程师(原样)这样做是有原因的。我没有,但我想...
【解决方案2】:

虽然确实是多余的,但它保证了如果接口实现从父类中移除,子类仍然会被Map接口持有并产生必要的编译错误。

【讨论】:

  • 如果你重新设置它的基础,并且新的基础没有实现 Map<K,V>并且你没有添加 implements 和必要的管道,那将是一个相当令人震惊的编辑。 :-)
【解决方案3】:

这个“看起来”像一个俯瞰。如果你扩展一个类,你会自动实现基类实现的所有接口(无论该基类是否为abstract)。所以,给定:

public interface I {}

public class A implements I {}

然后你声明:

public class B extends A {}

上面的声明严格等价于

public class B extends A implements I {}

确实可以忽略。很好的发现;)

【讨论】:

    猜你喜欢
    • 2012-06-25
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 2015-11-04
    相关资源
    最近更新 更多