我有两个界面:
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
我曾经使用过匿名类。
我想知道匿名类实现两个接口是否合法。
答案 0 :(得分:58)
“匿名内部类可以扩展一个子类或实现一个子类 接口。与非匿名类(内部或其他)不同,是匿名的 内在的阶级不能两者兼顾。换句话说,它不能同时扩展一个类和 实现一个接口,也不能实现多个接口。 “(http://scjp.wikidot.com/nested-classes)
答案 1 :(得分:15)
如果您决定这样做,您可以声明第三个界面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()
答案 2 :(得分:7)
为了保存一些按键(例如,如果接口有很多方法),你可以使用
abstract class Aggregate implements A,B{
}
new MyObject extends Aggregate{
void foo(){}
void bar(){}
}
请注意,关键是将Aggregate声明为抽象
答案 3 :(得分:1)
请注意,您可以创建一个名为 local 的类来实现这两个接口:
void method() {
class Aggregate implements A, B {
void foo() {}
void bar() {}
}
A a = new Aggregate();
B b = new Aggregate();
}
这使您免于进行类级别或顶级类声明。
结果称为local class。在实例方法中声明的本地类也是内部类,这意味着它们可以引用包含对象实例。