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

时间:2015-09-25 19:00:19

标签: java interface override extends

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

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

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

2 个答案:

答案 0 :(得分:11)

有一种情况是,您希望更新Javadoc文档以反映子接口中方法中更具体的合同,例如Collection#addAll(Collection)List#addAll(Collection)

  • Collection#addAll(Collection)

      

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

  • List#addAll(Collection

      

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

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

答案 1 :(得分:8)

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

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
    }