2017-05-01 4 views
0

Beachten Sie Folgendes:Wie Standard-Interface-Methode von einer anderen Unterklasse aufgerufen wird?

//Fooable.java 
public interface Fooable { 
    public default void foo() { 
     System.out.println("Fooable::foo"); 
    } 
    //Lots of other non-default methods... 
} 

//MyFooable.java 
public class MyFooable implements Fooable { 
    @Override 
    public void foo() { 
     System.out.println("MyFooable::foo"); 
    } 
    //implements other methods in Fooable... 
} 

//MyAdvancedFooable.java 
public class MyAdvancedFooable extends MyFooable { 
    @Override 
    public void foo() { 
     Fooable.super.foo(); 
     System.out.println("MyAdvancedFooable::foo"); 
    } 
    public static void main(String[] args) { 
     new MyAdvancedFooable().foo(); 
    } 
} 

Wie Sie sehen können, ich will foo() in Fooable von MyAdvancedFooable nennen (eine Unterklasse von MyFooable). Wenn ich jedoch versuche, zu kompilieren, erhalte ich den folgenden Fehler:

MyAdvancedFooable.java:4: Fehler: keine einschließende Klasse: Fooable Fooable.super.foo();

wenn ich MyAdvancedFooable extends MyFooable implements Fooable versuchen erhalte ich die folgenden:

MyAdvancedFooable.java:4: Fehler: bad, Qualifier Fooable in Standard-Super Anruf Fooable.super.foo(); Methode foo() wird in MyFooable überschrieben

Wie kann ich dieses Problem beheben, ohne eine neue anonyme Implementierung von Fooable erstellen zu müssen?

Antwort

0

Sie müssen nur super.foo() oder this.super.foo() verwenden, wie es die Eltern des Objekts und nicht der Klasse ist, wie durch Fooable.super.foo() impliziert.

+1

Die OP will die 'foo()' Methode aus der anrufen Schnittstelle. Ihre Lösung würde stattdessen die Methode in 'MyFooable' aufrufen –

0

können Sie nur eine Methode einer Ebene aufrufen, so würden Sie

in MyFooable müssen, während nur super.foo() in MyAdvancedFooable

Aufruf
Verwandte Themen