2

众所周知,接口可以扩展Java中的接口。我有一个问题,如果接口B扩展接口A,B不需要实现A中定义的方法。但是在java.util包中,List接口扩展了Collection接口,它实现了Collection方法,这些方法也只要有方法声明。

为什么要这样做,并且有更好的做法?在子接口中实现方法有什么区别吗?

4

4 回答 4

5

重写方法,除了提供/替换方法实现之外,还允许提供更具体的 javadoc,并缩小返回类型。

例如,Collection.iterator()由以下方式指定:

返回此集合中元素的迭代器。没有关于元素返回顺序的保证(除非此集合是提供保证的某个类的实例)。

List.iterator()由指定

以正确的顺序返回此列表中元素的迭代器。

于 2012-11-03T02:13:18.490 回答
2

我在 java.util.List 中没有看到任何实现,而是声明。相反,List 的 javadocs 说,

List 接口对迭代器、add、remove、equals 和 hashCode 方法的合约添加了超出 Collection 接口中指定的附加规定。为方便起见,此处还包括其他继承方法的声明。

于 2012-11-03T02:18:12.170 回答
0

Java 中的接口是完全抽象的。他们不能有任何实现。

重新声明方法与实现方法不同。并且重新声明一个方法(如果方法签名完全相同)没有任何意义,因为一个接口扩展另一个接口的目的是添加一些更具体的方法声明,而不仅仅是重新声明现有的方法。


编辑


正如@Arham@meriton 的回答所指出的,重新声明的目的是根据子接口重新指定方法。因此,对于访问底层集合的客户端代码,重新声明的方法将有一个单独的更具体的规范,而不是超级接口中更通用的规范。

于 2012-11-03T02:12:28.553 回答
0

接口 List 不实现 Collections 的方法,因为接口不能实现方法,它们只是声明它们。接口就像一个 100% 的抽象类:所有的方法都必须是抽象方法。

可能你的困惑来自实现接口的抽象类:这些类不能实现接口的方法(尽管被允许),只有第一个具体类必须。

于 2012-11-03T02:15:48.143 回答