【发布时间】:2015-12-23 16:26:57
【问题描述】:
例如,我有一个接口 A 和 B。A 有一个称为 foo 的(抽象)方法。 B 扩展 A。
即使使用@Override 也可以覆盖接口B 中的foo,但是在任何情况下这有意义吗?没有什么可以覆盖的,因为这两种方法都必须是抽象的并且没有主体。所以我想这没有任何意义,对吧?
那么为什么可以在接口中覆盖?
【问题讨论】:
标签: java interface overriding extends
例如,我有一个接口 A 和 B。A 有一个称为 foo 的(抽象)方法。 B 扩展 A。
即使使用@Override 也可以覆盖接口B 中的foo,但是在任何情况下这有意义吗?没有什么可以覆盖的,因为这两种方法都必须是抽象的并且没有主体。所以我想这没有任何意义,对吧?
那么为什么可以在接口中覆盖?
【问题讨论】:
标签: java interface overriding extends
一种情况是当您想要更新 Javadoc 文档以在子接口中的方法中反映更具体的协定时,例如 Collection#addAll(Collection) 和 List#addAll(Collection):
Collection#addAll(Collection):
将指定集合中的所有元素添加到此集合(可选操作)...
List#addAll(Collection:
将指定集合中的所有元素追加到此列表的末尾,按照指定集合的迭代器返回的顺序(可选操作)...
子接口还可以添加从 Java 8 开始的默认实现。
【讨论】:
addAll() 是一个很好的例子,但也许你应该说明合同中的不同之处。
void,但协变返回类型特性仍然普遍存在 :)
子类型可以施加更多条件,改变返回类型,改变抛出类型。一个例子
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
}
【讨论】: