在匿名类中实现两个接口

Cod*_*oet 47 java android

我有两个接口:

interface A {
    void foo();
}

interface B {
    void bar();
}
Run Code Online (Sandbox Code Playgroud)

我能够创建实现这些接口之一的类的匿名实例,如下所示:

new A() {
    void foo() {}
}
Run Code Online (Sandbox Code Playgroud)

要么:

new B() {
    void bar() {}
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个实现两个接口的匿名类.像(虚构的):

new A implements B {
    void foo() {}
    void bar() {}
}
Run Code Online (Sandbox Code Playgroud)

这显然会产生编译错误:"B无法解析为类型".

解决方法很简单:

class Aggregate implements A, B {
    void foo() {}
    void bar() {}
}
Run Code Online (Sandbox Code Playgroud)

然后Aggregate,我会使用匿名类.

我想知道一个匿名类实现两个接口是否合法.

dbf*_*dbf 57

"匿名内部类可以扩展一个子类或实现一个接口.与非匿名类(内部或其他)不同,匿名内部类不能同时执行这两种操作.换句话说,它不能同时扩展类并实现接口,也不能它实现了多个接口."(http://scjp.wikidot.com/nested-classes)


J S*_*rry 15

如果您决定这样做,您可以声明第三个接口,C:

public interface C extends A, B {
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以声明一个匿名内部类,这是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()");
      }
    });
  }

}
Run Code Online (Sandbox Code Playgroud)

这个例子的输出是:

foo()
bar()
baz()
Run Code Online (Sandbox Code Playgroud)


Add*_*dev 8

为了保存一些键击(例如,如果接口有很多方法),您可以使用

abstract class Aggregate implements A,B{
}

new MyObject extends Aggregate{
   void foo(){}
   void bar(){}
}
Run Code Online (Sandbox Code Playgroud)

请注意,关键是将Aggregate声明为抽象

  • 另一种方法是使Aggregate成为一个接口:`interface Aggregate extends A,B {}`. (14认同)
  • 用什么语言编译? (8认同)
  • 例如,在Java中? (4认同)