接口(interface)定义(见下文)让我感到困惑:
public abstract interface Cursor {
// hide details
}
public abstract interface Parcelable {
// hide details
}
public interface Foo<T extends Bar> extends Cursor, Parcelable {
// details omitted for brevity
};
- 我认为 Java 没有多重继承,因此一个类不能
扩展
多个类。 - 另一方面,一个类/接口(interface)可以实现多个接口(interface)。那么为什么使用
extends
而不是实现
?
最佳答案
Java 7及以下版本中类/接口(interface)继承和实现的规则如下:
- 一个类只能从单个类继承(单一继承)
- 一个类可能实现一个或多个接口(interface)(多个接口(interface)实现)
- 一个接口(interface)可以继承一个或多个接口(interface)(多个接口(interface)继承)
继承时,使用关键字extends
,当一个类继承自一个类或一个接口(interface)继承自一个或多个接口(interface)时。术语extends
可以理解如下:这个类/接口(interface)是其父类/接口(interface)的扩展——它是父类/接口(interface)的一切,甚至可能更多。
当一个类实现一个接口(interface)(或多个接口(interface))时,可以使用关键字 implements
。术语implements
应理解如下:保证此类的实例提供父接口(interface)方法的实现。
另外,请注意 abstract class
使用关键字implements
当引用父接口(interface)时,即使抽象类本身没有实现接口(interface)方法。这并不违反上述原则:只能有具体类的实例,该实例必须实现每个声明的方法;因此,该抽象类的任何实例实际上都必须是实现接口(interface)方法的子类的实例。例如,这是完全有效的:abstract class AnAbstractClass implements Cursor {}
,即使 Cursor 声明了很多方法。
在您的示例中,接口(interface) Foo<T extends Bar>
继承自另外两个接口(interface),即Cursor
和Parcelable
,这是上面第三点的一个例子。您使用关键字extends
而不是implements
因为接口(interface)Foo
没有实现任何东西:父接口(interface)的方法体仍然没有定义!如果您有一个实现这两个父接口(interface)的类,您将执行以下操作:
class AClass implements Cursor, Parcelable {
@Override public // ... method signature and implementation
// for every method in Cursor and Parcelable
}
另外,请注意,您不需要使用关键字 abstract
声明接口(interface)时:类型及其所有声明的方法都是隐式抽象的。这些方法也是隐式公共(public)的(并且不能用任何其他访问修饰符声明),因为接口(interface)的目的正是声明“对象的公共(public)接口(interface)”,即保证哪些方法可供任何人公开使用实现该接口(interface)的对象。
最后,上面描述的一些概念在 Java 8 中可能会略有变化:在该版本中,您将能够在接口(interface)中提供方法的“默认实现”,以防实现接口(interface)的类不这样做不实现它们。事情将更类似于“类多重继承”:一个类将能够从多个源继承已实现的方法,这在 Java 7 或更低版本中是不可能的。例如(语法尚未固定):
interface NaturalNumber {
void increment();
default void add(int n) {
for (int i = 0; i < n; i++) {
increment();
}
}
}
class NaturalNumberImplementation implements NaturalNumber {
private int n = 0;
@Override public void increment() { n++; }
}
它的存在是为了让您可以在不需要时忽略某些方法的实现,同时在可能/需要时仍然能够实现它们的“更好”版本。例如:
class HighPerformanceNaturalNumberImplementation implements NaturalNumber {
private int n = 0;
@Override public void increment() { n++; }
@Override public void add(int n) { this.n += n; }
}
关于java - 扩展接口(interface)而不是实现它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17227990/