Implement two interfaces in an anonymous class

JavaAndroid

Java Problem Overview


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.

Java Solutions


Solution 1 - Java

"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)

Solution 2 - Java

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()

Solution 3 - Java

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.

Solution 4 - Java

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCode PoetView Question on Stackoverflow
Solution 1 - JavadbfView Answer on Stackoverflow
Solution 2 - JavaJ Steven PerryView Answer on Stackoverflow
Solution 3 - JavaAddevView Answer on Stackoverflow
Solution 4 - JavaLiiView Answer on Stackoverflow