在匿名类中实现两个接口。
在匿名类中实现两个接口。
我有两个接口:
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日
如果您决定这样做,可以声明第三个接口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()
“匿名内部类可以扩展一个子类或实现一个接口。与非匿名类(包括内部和其他类)不同,匿名内部类不能同时执行两者。换句话说,它不能同时扩展类和实现接口,也不能实现多个接口。” (http://scjp.wikidot.com/nested-classes)