在匿名类中实现两个接口

时间:2011-11-17 08:02:00

标签: java android

我有两个界面:

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我曾经使用过匿名类。

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

4 个答案:

答案 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。在实例方法中声明的本地类也是内部类,这意味着它们可以引用包含对象实例。