【问题标题】:Does it make sense to override a method in an interface [duplicate]覆盖接口中的方法是否有意义[重复]
【发布时间】:2015-12-23 16:26:57
【问题描述】:

例如,我有一个接口 A 和 B。A 有一个称为 foo 的(抽象)方法。 B 扩展 A。

即使使用@Override 也可以覆盖接口B 中的foo,但是在任何情况下这有意义吗?没有什么可以覆盖的,因为这两种方法都必须是抽象的并且没有主体。所以我想这没有任何意义,对吧?

那么为什么可以在接口中覆盖?

【问题讨论】:

    标签: java interface overriding extends


    【解决方案1】:

    一种情况是当您想要更新 Javadoc 文档以在子接口中的方法中反映更具体的协定时,例如 Collection#addAll(Collection)List#addAll(Collection)

    • Collection#addAll(Collection):

      将指定集合中的所有元素添加到此集合(可选操作)...

    • List#addAll(Collection:

      将指定集合中的所有元素追加到此列表的末尾,按照指定集合的​​迭代器返回的顺序(可选操作)...

    子接口还可以添加从 Java 8 开始的默认实现。

    【讨论】:

    • addAll() 是一个很好的例子,但也许你应该说明合同中的不同之处。
    • 是的。这称为协变返回类型。见en.wikipedia.org/wiki/…
    • @ErickG.Hagstrom 在我的示例中,两者都返回 void,但协变返回类型特性仍然普遍存在 :)
    • 糟糕,是的,我现在明白了。 :-)
    【解决方案2】:

    子类型可以施加更多条件,改变返回类型,改变抛出类型。一个例子

    interface AutoCloseable
        void close() throws Exception
    
    interface Closeable extends AutoCloseable
        void close() throws IOException
    

    (子类型也可以用方法签名的擦除版本覆盖......但这是老故事)

    在java8中,子接口可以为抽象方法提供一个默认的impl

    interface DummyCloseable extends Closeable
    {
        default void close()
        {
            // do nothing
        }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2015-08-20
    • 2016-01-24
    • 2021-11-02
    • 2013-11-14
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多