Java接口上的多重继承

Jac*_*ace 28 java multiple-inheritance

我认为多重继承在Java中总是非法的,但是这段代码编译:

public interface A {
  void a();
}

public interface B {
  void b();
}

public interface AB extends A, B {
}
Run Code Online (Sandbox Code Playgroud)

有一个空的界面,如AB被认为是一个坏的做法?有没有办法在避免空接口(使用泛型或其他方式)的同时实现类似的东西?

注意:我不是在问如何通过接口模拟多重继承.我意识到我可以做到以下几点:

public class AbImpl implements A, B {
  public void a() {}
  public void b() {}
}
Run Code Online (Sandbox Code Playgroud)

由于各种原因,我需要一个具有两种方法的接口.

Bri*_*new 28

不允许多次继承实现.但是,组件可以继承多个接口.

继承多个接口不成问题,因为您只是定义要实现的新方法签名.它是多个功能副本的继承,传统上被认为是导致问题,或者至少是混乱(例如,死亡钻石).

  • 这个答案已经过时了:Java 8允许接口中的[方法实现的多重继承](https://www.programcreek.com/2014/12/default-methods-in-java-8-and-multiple-inheritance/)。 (2认同)

Mac*_*rko 8

接口可以扩展一个或多个其他接口.您还可以在类中实现多个接口.这是合法的,因为接口只是合同 - 没有实现.你只是简单地定义了一个类能够做什么的合同,而没有说明类如何做到这一点.


Boh*_*ian 5

实现接口不是“继承”,这是当您扩展类时。

实现接口用于声明类“看起来像”某物,而扩展类用于声明类“是”某物。

可以“看起来”多种事物,但不能“成为”多种事物。


使用扩展多个接口的空接口作为将一组接口收集到单个接口中以传达更广泛但可重用的 API 的一种方式并没有错。