56

I have two interfaces:

interface A {
    void foo();
}

interface B {
    void bar();
}

I am able to create anonymous instances of classes implementing either of these interfaces like so:

new A() {
    void foo() {}
}

or:

new B() {
    void bar() {}
}

I want to create an anonymous class that implements both interfaces. Something like (the fictitious):

new A implements B {
    void foo() {}
    void bar() {}
}

This obviously gives a compile error: "B cannot be resolved to a type".

The workaround is quite simple:

class Aggregate implements A, B {
    void foo() {}
    void bar() {}
}

I then use Aggregate where ever I would have used the anonymous class.

I was wondering if it is even legal for an anonymous class to implement two interfaces.

Lii
  • 11,553
  • 8
  • 64
  • 88
Code Poet
  • 11,227
  • 19
  • 64
  • 97
  • See [why-an-anonymous-class-cant-implement-multiple-interfaces-directly](http://stackoverflow.com/questions/4774168/why-an-anonymous-class-cant-implement-multiple-interfaces-directly) – nawfal Jun 30 '14 at 05:35

4 Answers4

70

"An anonymous inner class can extend one subclass or implement one interface. Unlike non-anonymous classes (inner or otherwise), an anonymous inner class cannot do both. In other words, it cannot both extend a class and implement an interface, nor can it implement more than one interface. " (http://scjp.wikidot.com/nested-classes)

masted
  • 1,211
  • 2
  • 8
  • 14
dbf
  • 6,399
  • 2
  • 38
  • 65
23

If you are determined to do this, you could declare a third interface, C:

public interface C extends A, B {
}

In this way, you can declare a single anonymous inner class, which is an implementation of C.

A complete example might look like:

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()");
      }
    });
  }

}

The output of this example is:

foo()
bar()
baz()
J Steven Perry
  • 1,711
  • 1
  • 17
  • 28
7

For save some keystrokes (for example if the interfaces have a lot of methods) you can do this:

abstract class Aggregate implements A, B {
}

new MyObject extends Aggregate {
   void foo() {}
   void bar() {}
}

Notice the key is to declare the Aggregate as abstract.

Lii
  • 11,553
  • 8
  • 64
  • 88
Addev
  • 31,819
  • 51
  • 183
  • 302
4

Note that you can make a named local class that implements the two interfaces:

void method() {
    class Aggregate implements A, B {
        void foo() {}
        void bar() {}
    }

    A a = new Aggregate();
    B b = new Aggregate();
}

This save you from doing a class-level or top-level class declaration.

The result is called a local class. Local classes declared in instance methods are also inner classes, which means that they can reference the containing object instance.

Lii
  • 11,553
  • 8
  • 64
  • 88