参考文献

  • Java8实战

解决问题的三条规则

  • 如果一个类使用相同的函数签名从多个地方(比如另一个类或接口)继承了方法,通过三条规则可以进行判断.

  • 类中的方法优先级最高.类或父类中声明的方法的优先级高于任何声明为默认方法的优先级.

  • 如果无法依据第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package com.holelin.sundry.test.common;

    public interface A {
    default void hello() {
    System.out.println("Hello from A");
    }
    }

    interface B extends A {
    default void hello() {
    System.out.println("Hello from B");
    }
    }

    class C implements B, A {
    public static void main(String... args) {
    new C().hello();
    }
    }
    // Hello from B
  • 最后,如果还是无法判断,继承了多个接口的类必须通过显式覆盖和调用期望的方法显式地选择使用哪一个默认方法的实现.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package com.holelin.sundry.test.common;

    public interface A {
    default void hello() {
    System.out.println("Hello from A");
    }
    }

    interface B {
    default void hello() {
    System.out.println("Hello from B");
    }
    }

    class C implements B, A {
    public static void main(String... args) {
    new C().hello();
    }

    // 显式覆盖和调用期望的方法
    @Override
    public void hello() {
    B.super.hello();
    }
    }