【问题标题】:Why does NavigableSet (which extends SortedSet) declare subSet(E fromElement, E toElement) again? [duplicate]为什么 NavigableSet(它扩展了 SortedSet)再次声明 subSet(E fromElement, E toElement)? [复制]
【发布时间】:2012-03-10 06:38:18
【问题描述】:

interface NavigableSet<E> 扩展 interface SortedSet<E> 声明方法 SortedSet<E> subSet(E fromElement, E toElement) 。 但是,当我查看NavigableSet's API 时,我发现它声明了相同的方法(具有完全相同的签名)。我还看到它说它从SortedSet 继承了一些方法(第一个、最后一个、可比较的)。

既然根据定义,接口只包含方法签名,为什么任何子接口都要重新声明父接口已经声明的相同方法(在 API javadoc 中语义上没有区别)?

编辑:在这里遇到了一个相关且很好的讨论 - In Java when one interface extends another, why would one redeclare a method in a subinterface?

【问题讨论】:

    标签: java


    【解决方案1】:

    这样做在 Java 中肯定是允许的。

    这里是源代码:

    /**
     * {@inheritDoc}
     *
     * Equivalent to {@code subSet(fromElement, true, toElement, false)}.
     */
    public SortedSet<E> subSet(E fromElement, E toElement)
    

    也许该类的作者发现重复定义是值得的,因为 subSet第二个 定义返回一个 NavigableSet,因此两者并排显示Javadoc 列表中的一个比主要方法列表中的一个和“继承”部分中的一个更好。

    firstlast 肯定没有充分的理由这样做,所以没有这样做。

    以下是 Javadocs 添加 subSet、headSet 和 tailSet 的第二个版本的理由:

    方法 subSet(E, E)、headSet(E) 和 tailSet(E) 被指定返回 SortedSet 以允许对 SortedSet 的现有实现进行兼容改造以实现 NavigableSet,但鼓励此接口的扩展和实现覆盖这些方法以返回 NavigableSet。

    您可能希望尝试自己的实验,设计几个接口,一个从另一个继承,子接口添加一个继承方法的新版本,看看是否有必要重新指定。 :-)

    【讨论】:

    • 有道理。谢谢!我知道它在java中是允许的;只是不明白为什么有人会这样做。现在我知道了。
    • 如果你想在 Javadoc 中添加一些东西,你可以在子接口中重新声明方法。
    【解决方案2】:

    如果您查看JavadocNavigableSet.subSet(),它会说

    指定者:subSet in interface SortedSet&lt;E&gt;

    现在,Javadoc中“指定者”的含义揭晓,例如here

    已为接口中的方法添加“指定者:”链接 从超级接口实现方法。

    所以这个方法,正如你所期望的,实际上只在SortedSet 中声明:)

    【讨论】:

    • 不,我查看了 NavigableSet 的代码,它确实重新声明了 SortedSet。 “指定者”用于表示超级接口也指定了它
    猜你喜欢
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多