【问题标题】:Java interface extends interface in the java.util packageJava 接口扩展了 java.util 包中的接口
【发布时间】:2012-10-23 16:56:06
【问题描述】:

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

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

【问题讨论】:

  • List 中重新定义了 Collection 中的什么方法?你能举个例子吗?
  • List 中实现了哪些方法?
  • @Vikdor:所有这些......

标签: java interface


【解决方案1】:

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

例如,Collection.iterator() 指定为:

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

List.iterator()

指定

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

【讨论】:

    【解决方案2】:

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

    List 界面添加了额外的规定,超出 在 Collection 界面中指定的那些,在 迭代器的合约,添加,删除, equals 和 hashCode 方法。声明为 为方便起见,此处还包括其他继承的方法。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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


        编辑


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

        【讨论】:

        • 显然 Java API 的设计者不同意你的第二段。
        • @meriton:你能告诉我你想告诉我什么吗? :)
        • 嗯,他们确实List 中重新声明了Collection 的所有方法。如果他们认为这样做没有任何意义,我怀疑他们会这样做......
        • 他们只是为了方便而重新声明了它们。它还有助于重新定义该特定方法的 javadocs。
        • @meriton:我现在明白了,它有助于从子界面的角度重新规范行为。 :)
        猜你喜欢
        • 2011-01-14
        • 2023-03-22
        • 1970-01-01
        • 2020-01-13
        • 2012-11-06
        • 2017-12-07
        • 2012-12-19
        • 1970-01-01
        • 2019-10-14
        相关资源
        最近更新 更多