我必须在这里遗漏一些基本的Java术语:
可以扩展类,因此它们的子类可以继承。
接口可以实施。实现类必须实现所有接口的方法 - 接口本身不实现任何东西,只声明。
那么,当我查看HashSet(https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html)的文档时,我看到了接口 java中继承的方法列表。 util.Set?
答案 0 :(得分:2)
我想你是从生成的JavaDoc HTML中引用这样的语句:
从接口java.util.Set ...
继承的方法
这种意义上的继承意味着有问题的方法的签名是继承的,但不一定是实现。原因很简单:在Java中,您通常不会查看第三方代码的实现,而只会查看带有签名和JavaDoc的接口。
因此,基本上,这些方法的签名是从接口Set
继承的,并在HashSet
或AbstractSet
中实现。因此,实际上它正在实现接口Set
。
Sidenote :在Java 8中,您可以让Interfaces实现方法,但这是另一回事。
答案 1 :(得分:0)
我认为这与javadoc有关,而与语言有关。在Java中,必须实现接口中的所有方法。因此,从语言的角度来看,add
和addAll
之间没有真正的区别。两者都在Set
中声明; HashSet
是一个具体的阶级;因此,它必须为两者提供实施。
差异实际上只与作者是否有任何东西要添加到界面中的javadoc有关。对于add
,将javadoc添加到HashSet
是必要的,因为Set
将add
定义为可选操作(可以通过抛出异常来实现),因此HashSet
需要指明add
实际上做了一些有用的事情。但是,对于addAll
,无需在HashSet
中添加Set
javadoc中尚未包含的任何文档。
所以我认为javadoc页面稍微不准确;它真的应该说" javadoc"是继承自Set
,而不是方法。 (从技术上讲,这些方法并没有被继承,因为如果另一种具有相同签名的方法,接口中的抽象方法不会被继承 - 请参阅JLS 8.4.8。这同样适用于接口中声明的所有方法,无论javadoc是否表示他们已经继承&#34 ;.)但是,说"文档继承自java.util类。设定"读者可能看起来有些奇怪。如果它能够充分传达信息,那么我在这里可能存在轻微的技术不准确性。大多数读者都不会注意到这种不准确性,这并不重要。事实上,在你发布这个问题之前,我没有注意到javadoc中的这个小缺陷 - 而且我是一个曾经在编译器上使用不同语言并花了很多时间阅读语言标准的人深入研究术语的确切定义,以便我能够准确找出所需的标准。