4

Given to interfaces I1 and I2

interface I1{int i=1; void foo();}

interface I2{int i=2; int foo();}

is there any way for a class A to implements both of them? I can't manage to correctly implement the foo methods, and this makes sense, because having the same input parameters in I1.foo() and I2.foo() wouldn't let class A distinguish between the two.

But the constant "i" is not a problem, provided that you cast A to one of the interfaces when trying to read them:

System.out.println(((I2)new A()).i);

it looks like the compiler says: "Ok i'm leaving you with an ambiguity in 'potentiality', but when it comes to 'actuality' i'm going to stop you". And the "actuality" for the methods seems to come earlier.

Am I right? Am I missing something? Am i just going crazy imagining a compiler talking to me like an aristotelian?

Dave Newton
  • 158,873
  • 26
  • 254
  • 302
Luigi Cortese
  • 10,841
  • 6
  • 37
  • 48
  • This may help you out: [Method name collision in interface implementation - Java](http://stackoverflow.com/questions/2598009/method-name-collision-in-interface-implementation-java) – mdl Jan 27 '14 at 22:34

3 Answers3

4

No. You can think of interfaces in Java as contracts. Because these interfaces have the same method name (but different return types) no one class can fulfil both contracts. If they had different arguments the answer would be yes.

Elliott Frisch
  • 198,278
  • 20
  • 158
  • 249
4

If you are using Java 8, you could do something like this:

interface I1 {
  default void foo() {
    //some default implementation
  }
}

interface I2 {
  default int foo() {
    //some default implementation
  }
}

public class SomeClass implements I1, I2 {
  I2.super.foo();
}
noMAD
  • 7,744
  • 19
  • 56
  • 94
0

Trying to fulfil a multitude of interfaces, might be better solved by a lookup discovery. The largest advantage is decoupling of dependencies, and dynamic discovery.

(I am aware this does not target the theorising.)

class A {
    private Map<Class<?>, ?> capabilities;
    A() {
        capabilities.put(I1.class, new I1() {...});
        capabilities.put(I2.class, new I2() {...});
    }

    public <T> T lookup(Class<T> intf) {
        Object obj = capabilities.get(intf);
        if (obj == null) {
            throw new OperationNotSupportedException(
               "Interface not found: " + intf.getName());
        }
        return intf.cast(obj);
    }
Joop Eggen
  • 107,315
  • 7
  • 83
  • 138