Java8中菱形问题解析或多重继承的规则

Ank*_*ngh 3 java oop diamond-problem java-8 default-method

在 Java 中,一个类只能扩展一个父类,但可以实现多个接口。随着 Java 8 接口中默认方法的引入,通过实现具有相同默认方法的 2 个接口,一个类有可能继承多个具有相同签名的方法 这可能会产生像 C++ 中的菱形问题

在下面的代码示例中的输出

new C().hello(); is 
Run Code Online (Sandbox Code Playgroud)

这是第二

   public interface First {

    default void hello(){
        System.out.println("This is First");
    }
}

 public interface Second extends First {

    default void hello(){
        System.out.println("This is Second");
    }
}

  public class MyClass implements First,Second {

    public static void main(String[] args) {
        new MyClass().hello();
    }
}
Run Code Online (Sandbox Code Playgroud)

Java用来解决钻石问题的解析规则是什么?一个简单的答案,比如谁优先,什么时候会很好。

小智 5

以下是当一个类从多个地方(另一个类或接口)继承具有相同签名的方法时要遵循的规则:

  • 班级总是赢。类或超类中的方法声明优先于任何默认方法声明。
  • 否则,子接口获胜:选择最具体的默认提供接口中具有相同签名的方法。(例如,在您的案例中,来自 Second 接口的方法应该作为 Second extends First 运行)。
  • 最后,如果选择仍然不明确,从多个接口继承的类必须通过覆盖它并显式调用所需的方法来明确选择要使用的默认方法实现。