我确信这是基本的,但我很难过。这个例子非常过于简化,但归结为以下几点。我在类中有一些重载方法:
public void build(MyImplOneOfAnInterface item);
public void build(MyImplTwoOfAnInterface item);
然后我有另一种方法来执行以下操作:
public void buildIt(MyInterface item) {
build(item);
}
当我尝试编译时,出现以下错误:
无法找到符号
这是因为JVM无法在编译时确定接口的实现,因此它知道要调用哪个重载方法。
如何在运行时决定?似乎JVM应该能够解决这个问题。
PS:我不想定义一个以接口作为参数的方法,然后使用instanceof运算符执行一堆if / else语句。
答案 0 :(得分:7)
您可以使用double dispatch。有一个MyInterface.build
,然后在您的实现类中重载以调用相关方法。 e.g:
interface MyInterface {
void build(Thingy t);
}
class MyImplOneOfAnInterface implements MyInterface {
void build(Thingy t) { t.build(this); }
}
...
void buildIt(MyInterface item) {
item.build(this);
}
答案 1 :(得分:3)
将build()
逻辑放在实现中。 。因此,而不是build(item)
致电item.build()
。
或者查看visitor pattern,您可以item.build(builder)
代替builder.build(item)
答案 2 :(得分:1)
你正在寻找错误的继承。
MyImplOne ...和MyImplTwo都是你的界面的实现。但是如果你调用build(item),它会期望找到
public void build(MyInterface item):
否则,它可能会发现您传递了一个实现您的接口的对象,但它既不是MyImplOne类,也不是MyImplTwo类。
喜欢定义方法
public void print(Vector vector);
并希望编译器可以解析
print(new Object());
答案 3 :(得分:0)
它作为void buildIt(MyInterface item)
类型传递到MyInterface
。当您尝试呼叫build(item)
时,它会查找签名为void build(MyInterface item)
的方法。如您所见,此方法不存在 - 这就是您找到符号未找到错误的原因。