Java 8 Standardmethodenvererbung

Angenommen, es gibt folgende Typen:

public interface Base {

    default void sayHi(){
        System.out.println("hi from base");
    }
}

public interface Foo extends Base {
    @Override
    default void sayHi(){
        System.out.println("hi from foo");
    }
}

public interface Bar extends Base {
}

public class MyClass implements Foo, Bar {
    public static void main(String[] args) {
        MyClass c = new MyClass();
        c.sayHi();
    }
}

In diesem Szenario, wennmain wird ausgeführt, "hi from foo" wird gedruckt. Warum tutFoo 's Umsetzung haben Vorrang? NichtBar erbensayHi() vonBase, da wennMyClass sollte nur @ implementierBar, dasBase Implementierung würde aufgerufen werden? Es wäre also sinnvoll, den Code immer noch nicht zu kompilieren. Auch seitBar sollte habenBase 's Implementierung vonsayHi(), warum kann ich es nicht in @ überschreibMyClass mögen

@Override
public void sayHi() {
    Bar.super.sayHi();
}

Der folgende Fehler tritt auf, wenn Sie versuchen, dies zu tun:

bad type qualifier Bar in der Standardmethode für Superaufrufe, sayHi () wird in Foo @ überschrieb

Antworten auf die Frage(4)

Ihre Antwort auf die Frage