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

使用接口调用的Java方法重载,java,interface,overloading,Java,Interface,Overloading,我相信这是基本的,但我被难住了。这个例子过于简化,但归结起来如下。我在这样的类中有一些重载方法: public void build(MyImplOneOfAnInterface item); public void build(MyImplTwoOfAnInterface item); 然后,我有另一种方法可以执行以下操作: public void buildIt(MyInterface item) { build(item); } 当我尝试编译时,出现以下错误: 找不到符号 这

我相信这是基本的,但我被难住了。这个例子过于简化,但归结起来如下。我在这样的类中有一些重载方法:

public void build(MyImplOneOfAnInterface item);
public void build(MyImplTwoOfAnInterface item);
然后,我有另一种方法可以执行以下操作:

public void buildIt(MyInterface item) {
     build(item);
}
当我尝试编译时,出现以下错误:

找不到符号

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

如何在运行时确定这一点?看起来JVM应该能够解决这个问题


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

它作为
MyInterface
类型被传递到
void buildIt(MyInterface项)
。当您尝试调用
build(item)
时,它会查找签名为
void build(MyInterface item)
的方法。如您所见,此方法不存在-这就是为什么会出现符号未找到错误。

您可以使用。拥有一个
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);
}
在实现中放置
build()
逻辑。因此,调用
item.build()
,而不是
build(item)


或者看一下,在这里您可以执行
item.build(builder)
而不是
builder.build(item)

您看到的继承是错误的

我的心。。。和MyImpl2都是您接口的实现。但如果您调用build(item),它将期望找到

public void build(MyInterface item):
否则,它可能会发现您传递了一个实现接口的对象,但该对象既不是来自类MyImplOne,也不是来自类MyImplTwo

就像定义一个方法一样

public void print(Vector vector);
希望编译器能解决这个问题

print(new Object());

然后改用。否?“找不到符号”听起来像是编译器错误(而不是JVM的运行时错误),表示找不到在代码中指定的变量或类。使用扩展名怎么样?i、 例如,
类MyImploneInterface扩展了我的接口
。听起来会更好?这是模拟的双重分派,是的一个应用程序。事实上,Java不能实现真正的双重分派。@Kit Ho:我不明白你的意思。我假设
myimploneofainterface
是一个具体的类。@Kit:您不能扩展接口,如果您是指通过(抽象)基类实现继承,那么它就不起作用了……您不会被留下双重分派,而是会有相同的编译错误。@Mark Peters:接口可以扩展。参见本文[link],我认为使用继承架构会更好。