在匿名类中实现两个接口

2022-08-31 20:12:09

我有两个接口:

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

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


答案 1

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


答案 2

如果您决心这样做,则可以声明第三个接口 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()");
      }
    });
  }

}

此示例的输出为:

foo()
bar()
baz()

推荐