2013-02-12 7 views
9

Ich bin gerade auf ein Verhalten gestoßen, das ich zuerst für einen Fehler in Eclipse hielt. Betrachten Sie diese einfache Klasse:Warum kann meine Klasse keine Schnittstelle implementieren, die darin deklariert ist?

public class Foo { 
    public static interface Callback { 
     public void onAction(); 
    } 
} 

Dies ist absolut gültig. Dies ist jedoch nicht:

public class Foo implements Callback { 
    public static interface Callback { 
     public void onAction(); 
    } 

    public void onAction() { /*some implementation*/ } 
} 

Aber dies gilt auch dann:

public class Foo { 
    public static interface Callback { 
     public void onAction(); 
    } 

    private final Callback mCallback = new Callback() { 
     public void onAction() { /*some implementation*/ } 
    }; 
} 

Warum Java zwingen mich zu Art von ‚Abfall‘ ein Mitglied für sie, wenn sie einfach es retten könnte indem ich das selbst umsetzen lasse? Ich kenne den "Workaround" sehr gut, um diese Schnittstelle in eine eigene Datei zu stellen, aber aus Neugier: Gibt es einen Grund, warum das nicht funktioniert?

+0

AFAIK, können Sie nicht eine neue auf einer Schnittstelle, so neu Callback() ist ungültig –

+2

Ich bin mir nicht sicher, die offizielle Begründung dafür nicht funktioniert, aber ich sehe keinen Grund, warum Sie wollen Eine Klasse implementiert eine Schnittstelle, die sie enthält - warum würden Sie nicht einfach die Klasse mit den Methoden definieren, die Sie in die Schnittstelle einfügen wollen? Warum willst du in diesem Fall überhaupt ein Interface? – iamnotmaynard

+2

@MiguelPrz Er erstellt eine Implementierung der Schnittstelle inline mit '{}' – Miquel

Antwort

6

In Ihrem zweiten Fall, da die Signaturen vor den Körpern der Klassen überprüft werden, wenn der Compiler versucht, die Foo Klasse zu kompilieren, ist die Callback Schnittstelle noch nicht definiert.

8

Mit diesem Code

public class Foo implements Callback{ 

public static interface Callback{ 
    public void onAction() 
} 

public void onAction(){//some implementation} 
} 

was ist Callback? Der Compiler (btw, der sich von Eclipse unterscheidet,) weiß nicht, was Callback ist.

Sie haben die Schnittstelle Callback nach der Verwendung definiert.

+1

kann der Compiler nicht voraussehen und bekommen Sie eine Liste aller Klassen zu kommen?! fühlt sich irgendwie albern an – NikkyD