Java文档:什么是';从接口X继承的方法

Java文档:什么是';从接口X继承的方法,java,inheritance,interface,Java,Inheritance,Interface,这里我肯定缺少一些基本的Java术语: 类可以扩展,因此它们的方法可以由它们的子类继承 接口可以实现。实现类必须实现接口的所有方法-接口本身不实现任何东西,只声明 那么,当我查看HashSet()的文档时,为什么会看到一个从接口继承的方法列表?我猜您指的是生成的JavaDoc HTML中的类似语句: 从接口java.util.Set继承的方法 从这个意义上讲,继承意味着相关方法的签名是继承的,但不一定是实现。原因很简单:在Java中,通常不研究第三方代码的实现,而只研究带有签名和JavaDoc的

这里我肯定缺少一些基本的Java术语:

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

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


那么,当我查看HashSet()的文档时,为什么会看到一个从接口继承的方法列表?

我猜您指的是生成的JavaDoc HTML中的类似语句:

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

从这个意义上讲,继承意味着相关方法的签名是继承的,但不一定是实现。原因很简单:在Java中,通常不研究第三方代码的实现,而只研究带有签名和JavaDoc的接口

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



Sidenote:在Java8中,可以使用接口实现方法,但这是另一回事。

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

区别实际上只是与作者是否有任何东西要添加到接口中的javadoc有关。对于
add
,有必要将javadoc添加到
HashSet
,因为
Set
add
定义为可选操作(可以通过抛出异常来实现),因此
HashSet
需要指定
add
实际上做了一些有用的事情。但是,对于
addAll
,不需要在
HashSet
中添加任何
Set
的javadoc中没有的文档


所以我认为javadoc页面有点不准确;应该说“javadoc”是从
Set
继承的,而不是从方法继承的。(从技术上讲,这些方法不会被继承,因为如果存在具有相同签名的另一个方法,则接口中的抽象方法不会被继承——请参阅。这同样适用于接口中声明的所有方法,无论javadoc是否表示它们是“继承的”。)但是,表示“从类java.util.Set继承的文档”读者可能会觉得有点奇怪。因此,如果它充分传达了信息,我同意这里有一点技术上的错误。大多数读者不会注意到这种不准确,这真的不重要。事实上我没有注意到javadoc中的这个小缺陷,直到你发布了这个问题——我是一个曾经为另一种语言编写编译器的人,花了很多时间阅读语言标准,深入研究术语的确切定义,以便我能够准确地找到标准所要求的内容。

你缺少的是接口可以将另一个接口扩展到Java>=10中,这可能称为“中声明的方法”,请参阅以了解其含义