2011-11-17 18 views
32

を二つのインターフェースを実装します。私は2つのインターフェイス持っている匿名クラスで

interface A { 
    void foo(); 
} 

interface B { 
    void bar(); 
} 

私はそうのように、これらのインタフェースのいずれかを実装するクラスの匿名のインスタンスを作成することができています:

new A() { 
    void foo() {} 
} 

か:

new B() { 
    void bar() {} 
} 

両方のインターフェイスを実装する匿名クラスを作成します。 (架空の)ような何か:

new A implements B { 
    void foo() {} 
    void bar() {} 
} 

これは明らかにコンパイルエラーを与える:「Bタイプに解決することはできません」。

回避策

は非常に簡単です:

class Aggregate implements A, B { 
    void foo() {} 
    void bar() {} 
} 

私はその後、私は匿名クラスを使用していたこれまでAggregateを使用しています。

匿名クラスで2つのインターフェイスを実装することが正当なのかどうか疑問に思っていました。

+0

[理由 - anonymous-class-cant-implement-multiple-interfaces-directly](http://stackoverflow.com/questions/4774168/why-an-anonymous-class-cant-implement-multiple- interfaces-directly) – nawfal

答えて

52

「匿名の内部クラスは、一つのサブクラスを拡張する、または1つの インターフェースを実装することができる。非匿名クラス(内側またはその他)とは異なり、匿名 内部クラスは、両方を行うことができない。言い換えれば、両方のクラスを拡張することができないと インタフェースを実装し、またそれは、複数のインターフェイスを実装することができます。」(http://scjp.wikidot.com/nested-classes

7

を(インターフェイスは、メソッドの多くを持っている場合など)いくつかのキーストロークを保存するためにあなたが

abstract class Aggregate implements A,B{ 
} 

new MyObject extends Aggregate{ 
    void foo(){} 
    void bar(){} 
} 

お知らせ使用することができますキーは宣言することです抽象

+12

もう一つの方法は、Aggregateをインタフェース自体にすることです。 'interface Aggregate extends A、B {}'。 –

+7

これはどの言語でコンパイルされますか? – nachokk

+2

Javaでは、たとえば? –

13

あなたがこれを行うと判断された場合は、第3のインタフェースを宣言することができ、Cのように集計:このように

public interface C extends A, B { 
} 

は、あなたがの実装である、単一の匿名内部クラスを宣言することができますC.

完全な例は次のようになります。

public class MyClass { 

    public interface A { 
    void foo(); 
    } 

    public interface B { 
    void bar(); 
    } 

    public interface C extends A, B { 
    void baz(); 
    } 

    public void doIt(C c) { 
    c.foo(); 
    c.bar(); 
    c.baz(); 
    } 

    public static void main(String[] args) { 
    MyClass mc = new MyClass(); 

    mc.doIt(new C() { 
     @Override 
     public void foo() { 
     System.out.println("foo()"); 
     } 

     @Override 
     public void bar() { 
     System.out.println("bar()"); 
     } 

     @Override 
     public void baz() { 
     System.out.println("baz()"); 
     } 
    }); 
    } 

} 

この例の出力は次のとおりです。

これは、クラスレベルまたはトップレベルのクラス宣言をしてからあなたを救う

void method() { 
    class Aggregate implements A, B { 
     void foo() {} 
     void bar() {} 
    } 

    A a = new Aggregate(); 
    B b = new Aggregate(); 
} 

:あなたは二つのインタフェースを実装するという名前ローカルクラスを作ることができます

foo() 
bar() 
baz() 
0

注意。

結果はlocal classと呼ばれます。インスタンスメソッドで宣言されたローカルクラスは、内部クラスでもあり、これは、それらが含まれているオブジェクトインスタンスを参照できることを意味します。

関連する問題