使用接口调用的Java方法重载

时间:2011-07-18 15:48:01

标签: java interface overloading

我确信这是基本的,但我很难过。这个例子非常过于简化,但归结为以下几点。我在类中有一些重载方法:

public void build(MyImplOneOfAnInterface item);
public void build(MyImplTwoOfAnInterface item);

然后我有另一种方法来执行以下操作:

public void buildIt(MyInterface item) {
     build(item);
}

当我尝试编译时,出现以下错误:

  

无法找到符号

这是因为JVM无法在编译时确定接口的实现,因此它知道要调用哪个重载方法。

如何在运行时决定?似乎JVM应该能够解决这个问题。

PS:我不想定义一个以接口作为参数的方法,然后使用instanceof运算符执行一堆if / else语句。

4 个答案:

答案 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)的方法。如您所见,此方法不存在 - 这就是您找到符号未找到错误的原因。