如何实现矛盾的接口

时间:2014-06-25 22:10:41

标签: java interface

我很快就遇到了一个奇怪的问题,我无法向自己解释。现实世界的问题已经解决了,我只是好奇我是否有一个令人满意的答案我找不到。

想象一下,您必须编写一个类,该类从您正在使用的某个框架实现以下接口:

interface Interface1 {
    String method();
}

到目前为止一切顺利。现在你引入第二个框架,如果你的类实现了第二个接口,它会非常有用:

interface Interface2 {
    Long method();
}

这就是出现问题的地方:

class ThatsTheProblem implements Interface1, Interface2 {
    public ???? method() {
        // ...
    }
}

有什么想法吗?

仅供参考:现实问题基于抽象dao模式,其中某些实体具有Long个ID,其他实体具有UUID个ID。

4 个答案:

答案 0 :(得分:4)

简短回答:你不能。

可以做的是提供实现一个或另一个接口的视图。例如:

public class OnePossibleSolution { // no "implements"

    private String interface1Method() {
        return "whatever";
    }

    public Interface1 asInterface1() {
        return new Interface1() {
            @Override
            String method() {
                return interface1Method();
            }
        }
    }

    // ditto for Interface2...

这可能是解决问题的最常用的Java方法。例如,当您想要迭代其元素时,Map就是这样做的。它不是试图解决成为Iterable<K>Iterable<V>Iterable<Map.Entry<K,V>>的问题,而是提供三种观点:

  • keySet()
  • values()
  • entrySet()

每个集合都返回一个相应的集合,该集合实现了相应的Iterable<...>接口。

答案 1 :(得分:0)

方法声明的两个组件包括方法签名 - 方法的名称和参数类型。这些方法具有相同的签名,因此不能由一个类实现。

请记住,在Java中,您不需要存储方法的结果。如果编译了ThatsTheProblem类,并且您有一个带有此代码的类,那么该方法的哪个版本会调用?

ThatsTheProblem ttp = new ThatsTheProblem();
ttp.method();

答案 2 :(得分:0)

显然不可能创建一个实现两个冲突接口的对象。但是,一个对象可以提供两个不同的facade,每个都实现冲突的接口。

请注意,这两个外观是指一个对象的公共实例变量,因此它们基本上代表同一个对象。

public interface Interface1 {

    String method();
}

public interface Interface2 {

    Long method();
}

public class DiMorph {

    String forInterface1 = "Number nine";
    Long forInterface2 = 9L;

    public Interface1 asInterface1() {
        return new AsInterface1();
    }

    private class AsInterface1 implements Interface1 {

        @Override
        public String method() {
            return forInterface1;
        }

    }

    public Interface2 asInterface2() {
        return new AsInterface2();
    }

    private class AsInterface2 implements Interface2 {

        @Override
        public Long method() {
            return forInterface2;
        }

    }
}

public void testInterface1(Interface1 i1) {

}

public void testInterface2(Interface2 i2) {

}

public void test() {
    DiMorph m = new DiMorph();
    testInterface1 (m.asInterface1());
    testInterface2 (m.asInterface2());
}

答案 3 :(得分:0)

引用@Andreas,这根本不可能。

想象一下,你有两个工人,爱丽丝和鲍勃,有两位经理,凯茜和戴夫。 Cathy希望Alice实现Work()方法并返回Java应用程序。另一方面,Dave希望Bob实现Work()方法并返回一个C ++库。你的问题建议是介绍一个新工人Eric,他可以同时做Alice和Bob的Work()。实际上发生的事情是Eric过载而无法编译。