【问题标题】:extending an interface instead of implementing it扩展接口而不是实现它
【发布时间】:2013-06-21 05:03:27
【问题描述】:

一个接口定义(见下文)让我很困惑:

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没有多重继承,所以一个类不能extends多个类。
  2. 另一方面,一个类/接口可以实现多个接口。那么为什么使用extends 而不是 implements?

【问题讨论】:

  • class/interface can implement more than one interface -- 接口方面是错误的 -- 接口不能实现任何东西。
  • 不赞成这个问题的人。奇怪
  • 什么是抽象接口?这甚至是有效的Java语法吗?即使它是我很确定它被忽略了。
  • 安德烈,检查我的答案,我讨论了那个语法。 tl;dr:它是有效的并且关键字 abstract 被忽略(接口是隐式抽象的)
  • @BrunoReis 这正是我所怀疑的。感谢您的澄清!

标签: java


【解决方案1】:

Java 7及以下的类/接口继承与实现规则如下:

  1. 一个类只能从一个类继承(单一继承)
  2. 一个类可能实现一个或多个接口(多接口实现)
  3. 一个接口可能继承自一个或多个接口(多接口继承)

在继承时,您使用关键字extends,无论是当一个类从一个类继承还是一个接口从一个或多个接口继承时。术语extends 应理解如下:这个类/接口是其父类/接口的扩展——它是父类或父类的一切,可能更多 .

当一个类实现一个接口(或多个接口)时,您使用关键字implements。术语implements 应理解为:保证此类的实例为父接口的方法提供实现

另外,请注意abstract class 在引用父接口时使用关键字implements,即使抽象类本身没有实现接口方法。这并不违反上述原则:只能有具体类的实例,必须实现每个声明的方法;因此,该抽象类的任何实例实际上都必须是实现接口方法的子类的实例。例如,这是完全有效的:abstract class AnAbstractClass implements Cursor {},即使 Cursor 声明了很多方法。

在您的示例中,接口Foo&lt;T extends Bar&gt; 继承自其他两个接口,即CursorParcelable,这是上面第三点的示例。您使用关键字extends 而不是implements,因为接口Foo 没有实现任何东西:父接口的方法体仍未定义!如果你有一个实现这两个父接口的类,你会这样做:

class AClass implements Cursor, Parcelable {
  @Override public // ... method signature and implementation
                   // for every method in Cursor and Parcelable
}

另外,请注意在声明接口时不需要使用关键字abstract:类型及其声明的所有方法都是隐式抽象的。这些方法也是隐式公共的(并且不能用任何其他访问修饰符声明),因为接口的目的正是声明“对象的公共接口”,即保证任何方法都可以公开使用实现该接口的对象。


最后,上面描述的一些概念在 Java 8 中会略有改变:在该版本中,您将能够在接口中提供方法的“默认实现”,以防实现接口的类不执行它们。事情将更类似于“类多重继承”:一个类将能够从多个来源继承实现的方法,这在 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; }
}

【讨论】:

【解决方案2】:

回答 1。

Java 类只能扩展一个父类。多重继承是 不允许。然而,接口不是类,接口可以 扩展多个父接口。

回答 2。

当存在父子关系时,您应该始终扩展类/接口。扩展类或接口应该没有其他理由。

【讨论】:

    【解决方案3】:

    接口:

    • 接口扩展接口。

    • 一个接口可以扩展多个接口。

    类:

    • 类扩展类。

    • 一个类只能扩展一个类。

    • 只有类可以实现接口。

    • 一个类可以实现多个接口。

    【讨论】:

      猜你喜欢
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多