我很快就遇到了一个奇怪的问题,我无法向自己解释。现实世界的问题已经解决了,我只是好奇我是否有一个令人满意的答案我找不到。
想象一下,您必须编写一个类,该类从您正在使用的某个框架实现以下接口:
interface Interface1 {
String method();
}
到目前为止一切顺利。现在你引入第二个框架,如果你的类实现了第二个接口,它会非常有用:
interface Interface2 {
Long method();
}
这就是出现问题的地方:
class ThatsTheProblem implements Interface1, Interface2 {
public ???? method() {
// ...
}
}
有什么想法吗?
仅供参考:现实问题基于抽象dao模式,其中某些实体具有Long
个ID,其他实体具有UUID
个ID。
答案 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过载而无法编译。