覆盖接口中的方法是否有意义

sto*_*r96 9 java extends overriding interface

我有一个接口A和B.A有一个叫做foo的(抽象)方法.B延伸A.

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

那么为什么可以在界面中覆盖呢?

man*_*uti 11

一种情况是,当你要更新的Javadoc文档,以反映在子接口方法的更具体的合同,就是这种情况与Collection#addAll(Collection)List#addAll(Collection):

  • Collection#addAll(Collection):

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

  • List#addAll(Collection:

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

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


Zho*_*gYu 8

子类型可以强加更多条件,更改返回类型,更改投掷类型.一个例子

interface AutoCloseable
    void close() throws Exception

interface Closeable extends AutoCloseable
    void close() throws IOException
Run Code Online (Sandbox Code Playgroud)

(子类型也可以覆盖方法签名的删除版本......但那是旧故事)

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

interface DummyCloseable extends Closeable
{
    default void close()
    {
        // do nothing
    }
Run Code Online (Sandbox Code Playgroud)