java - 扩展接口(interface)而不是实现它

标签 java

接口(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
};
  1. 我认为 Java 没有多重继承,因此一个类不能扩展多个类。
  2. 另一方面,一个类/接口(interface)可以实现多个接口(interface)。那么为什么使用 extends 而不是 实现

最佳答案

Java 7及以下版本中类/接口(interface)继承和实现的规则如下:

  1. 一个类只能从单个类继承(单一继承)
  2. 一个类可能实现一个或多个接口(interface)(多个接口(interface)实现)
  3. 一个接口(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),即CursorParcelable ,这是上面第三点的一个例子。您使用关键字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/

相关文章:

java - 如何使用 Java 向文件添加内容

java - 如何确保强制参数传递到 Spring MVC Controller 方法中?

java - 在iava中调用方法时缺少json键时如何抛出编译错误

java - org.apache.catalina.startup.Catalina.stopServer(Catalina.java :395)

java - iText PDF 字体不会发生变化。卢比符号未显示

java - JSF ViewHandlerWrapper 导致 NullPointerException

java - 有哪些 jSoup 优化技巧?

java - 使用 web.xml 配置带有 Glassfish 4 的 JX-RS 会导致错误

java - Android 中的 BreakIterator 错误地计算字符

java - 为什么在 Annotation 接口(interface)中声明 Object 的非最终公共(public)方法?