2013-02-12 6 views
9

私はちょうどそれがEclipseのバグだと思った振る舞いに遭遇しました。私のクラスが内部で宣言されたインタフェースを実装できないのはなぜですか?

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

これは完全に有効です。しかし、これではありません。

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

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

しかし、これはあまりにも、有効です。

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

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

それは単にそれを保存することができれば、なぜJavaは、「廃棄物」のようなものにするための部材で私を強制しません私自身にこれを実装させることによって?私は、このインターフェースを自分のファイルに入れるための「回避策」をよく知っていますが、好奇心から外しています。これがうまくいかない理由はありますか?

+0

AFAIK、新しいコールバック()が無効なため、新しいインターフェイスを作成することはできません –

+2

これは正常に動作しないという正式な理由はわかりませんが、理由はありませんクラスが含んでいるインターフェイスを実装しています。なぜ、インターフェイスに入れるメソッドでクラスを定義していないのですか?この場合、なぜインターフェイスが必要なのですか? – iamnotmaynard

+2

@MiguelPrz彼は '{} 'を使ってインラインでインラインでインプリメンテーションを作成しています – Miquel

答えて

6

2番目のケースでは、コンパイラがFooクラスをコンパイルしようとすると、クラス本体の前で署名がチェックされるため、Callbackインターフェイスはまだ定義されていません。

8

Callback何であるか、このコード

public class Foo implements Callback{ 

public static interface Callback{ 
    public void onAction() 
} 

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

を使用していますか?コンパイラ(Eclipseとは異なるbtw)は、Callbackを知らない。

Callbackインターフェイスは、使用後に定義しました。

+1

コンパイラが先読みして来るすべてのクラスのリストを取得できないのですか?ちょっとばかげている – NikkyD

関連する問題