【问题标题】:Java Documentation: What is meaning of 'methods inherited from interface XJava 文档:从接口 X 继承的方法是什么意思
【发布时间】:2017-08-09 05:02:34
【问题描述】:

我在这里肯定遗漏了一些基本的 Java 术语:

类可以扩展,因此它们的方法可以被它们的子类继承

接口可以实现。实现类必须实现接口的所有方法——接口本身不实现任何东西,只声明。

那么,当我查看 HashSet (https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html) 的文档时,为什么会看到从 interface java.util 中继承的方法列表。设置?

【问题讨论】:

  • 你错过了接口也可以扩展另一个接口的部分
  • 在 Java >= 10 中这可能被称为“方法声明在”,含义见stackoverflow.com/q/55938491

标签: java inheritance interface


【解决方案1】:

我猜你指的是生成的 JavaDoc HTML 中的这样的语句:

从接口 java.util.Set 继承的方法 ...

这种意义上的继承意味着所讨论的方法的签名是继承的,但不一定是实现。原因很简单:在 Java 中,您通常不会查看第三方代码的实现,而只会查看带有签名和 JavaDoc 的接口。

因此,基本上,这些方法的签名从接口Set 继承并在HashSetAbstractSet 中实现。因此,实际上它正在实现接口Set


旁注:在 Java 8 中,您可以使用接口实现方法,但这是另一回事。

【讨论】:

    【解决方案2】:

    我认为这与 javadoc 的关系比与语言的关系更大。在Java中,接口中的所有方法都必须实现。所以从语言的角度来看,addaddAll 之间没有真正的区别。两者都在Set 中声明; HashSet 是一个具体的类;因此它必须为两者提供一个实现。

    真正的区别在于作者是否有任何东西要添加到界面中的 javadoc 中。对于add,需要将javadoc添加到HashSet,因为Setadd定义为可选操作(可以通过抛出异常来实现),因此HashSet实际上需要指定add做一些有用的事情。但是,对于 addAll,无需在 HashSet 中添加任何尚未在 Set 的 javadoc 中的文档。

    所以我认为 javadoc 页面有点不准确;它真的应该说“javadoc”是从Set 继承的,而不是方法。 (从技术上讲,这些方法不会被继承,因为如果存在具有相同签名的另一个方法,则不会继承来自接口的抽象方法——请参阅JLS 8.4.8。这同样适用于声明的 所有 方法在界面中,无论 javadoc 是否说它们是“继承的”。)但是,说“从类 java.util.Set 继承的文档”对读者来说可能看起来有点奇怪。因此,如果它充分传达了信息,我可以接受轻微的技术错误。大多数读者不会注意到不准确之处,这并不重要。事实上,在您发布这个问题之前,我并没有注意到 javadoc 中的这个小缺陷——我曾经为不同语言的编译器工作,并花了很多时间阅读语言标准并深入研究术语的定义,以便我可以准确了解标准的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 2014-02-23
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多