在匿名类中实现两个接口。

9 浏览
0 Comments

在匿名类中实现两个接口。

我有两个接口:

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

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

admin 更改状态以发布 2023年5月21日
0
0 Comments

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

0
0 Comments

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

0