2013-02-12 9 views
9

Ho appena rilevato un comportamento. Ho inizialmente pensato che fosse un errore in Eclipse. Considera questa semplice classe:Perché la mia classe non può implementare un'interfaccia dichiarata al suo interno?

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

Questo è perfettamente valido. Tuttavia, questo non è:

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

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

Ma questo è valido anche:

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

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

Perché Java costringermi a sorta di 'rifiuti' membro per esso, se potesse semplicemente salvarlo permettendomi di implementare questo stesso? Sono ben consapevole della "soluzione" per mettere questa interfaccia nel proprio file, ma per curiosità: c'è una ragione per cui questo non funzionerà?

+0

AFAIK, non si può fare un nuovo su un'interfaccia, quindi il nuovo Callback() non è valido –

+2

Non sono sicuro della motivazione ufficiale per questo non funziona, ma non vedo alcun motivo per cui si vorrebbe avere una classe implementa un'interfaccia che contiene - perché non dovresti semplicemente definire la classe con i metodi che stai cercando di inserire nell'interfaccia? Perché vuoi un'interfaccia in questo caso? – iamnotmaynard

+2

@MiguelPrz sta creando un'implementazione dell'interfaccia inline usando '{}' – Miquel

risposta

6

Nel secondo caso, poiché le firme vengono controllate prima dei corpi delle classi, quando il compilatore tenta di compilare la classe , l'interfaccia Callback non è ancora definita.

8

Utilizzando questo codice

public class Foo implements Callback{ 

public static interface Callback{ 
    public void onAction() 
} 

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

cosa è Callback? Il compilatore (btw diverso da Eclipse,) non sa cosa sia Callback.

L'utente ha definito l'interfaccia Callback dopo l'uso.

+1

il compilatore non può guardare avanti e ottenere un elenco di tutte le classi a venire ?! sembra un po 'sciocco – NikkyD