我有一个接口A和B.A有一个叫做foo的(抽象)方法。 B延伸A。
即使使用@Override,也可以覆盖接口B中的foo,但是有没有合理的情况?没有什么可以覆盖,因为这两种方法都必须是抽象的,没有正文。所以我猜没有合理的情况,对吧?
那么为什么可以在界面中覆盖呢?
答案 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中,子接口可以为抽象方法
提供默认implinterface DummyCloseable extends Closeable
{
default void close()
{
// do nothing
}