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

Jos*_*ess 5 java overloading interface

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

public void build(MyImplOneOfAnInterface item);
public void build(MyImplTwoOfAnInterface item);
Run Code Online (Sandbox Code Playgroud)

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

public void buildIt(MyInterface item) {
     build(item);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我收到以下错误:

找不到标志

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

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

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

Oli*_*rth 7

你可以使用双重派遣.有一个MyInterface.build,然后在您的实现类中重载,以调用相关的方法.例如:

interface MyInterface {
    void build(Thingy t);
}

class MyImplOneOfAnInterface implements MyInterface {
    void build(Thingy t) { t.build(this); }
}

...

void buildIt(MyInterface item) {
    item.build(this);
}
Run Code Online (Sandbox Code Playgroud)