使用相同的方法签名实现多个接口

时间:2014-01-27 21:47:39

标签: java interface

给出接口I1和I2

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

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

A类有没有办法实现它们?我无法正确实现foo方法,这是有道理的,因为在I1.foo()和I2.foo()中使用相同的输入参数不会让A类区分这两者。

但是常量“i”不是问题,只要你在尝试读取它时将A转换为其中一个接口:

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

看起来好像是编译器说的:“好吧,我在'潜力'中会让你感到含糊不清,但是当谈到'现实'时,我会阻止你”。这些方法的“现状”似乎更早出现。

我是对的吗?我错过了什么吗?我只是想疯狂想象一个编译器像一个aristotelian一样对我说话吗?

3 个答案:

答案 0 :(得分:4)

没有。您可以将Java中的接口视为契约。因为这些接口具有相同的方法名称(但不同的返回类型),所以没有一个类可以满足这两个合同。如果他们有不同的论据,那么答案就是肯定的。

答案 1 :(得分:4)

如果您使用的是Java 8,则可以执行以下操作:

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

答案 2 :(得分:0)

尝试实现多种接口,可以通过查找发现更好地解决。最大的优势是依赖关系和动态发现的解耦。

(我知道这并不针对理论化。)

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