具有相同名称的函数接收不同派生类的实例

时间:2014-08-10 08:11:11

标签: java inheritance

我有一个基本抽象类和2个扩展类:

public abstract class A {}
public class B extends A {}
public class C extends A {}

然后我有一个带有2个类似函数的主类,一个调用类型B的对象,另一个调用类型C的对象:

public class Manager {
    public void foo(B b) {}
    public void foo(C c) {}
}

现在,我想在类管理器中执行类似的操作:

public void bar(A a) {
     foo(a);
}

在这一部分,我希望Java能够识别a是类型B还是C,并相应地调用相关函数 - 接受B作为参数的函数,或者接受C作为参数的函数。但是,这不起作用。相反,我必须这样做 -

if (a instanceof B) {
     foo((B)a);
} else {
     foo((C)a);
}

我在这里遗漏了什么吗?我注意到在所有其他地方,Java非常清楚要调用哪个函数,并且我在此函数调用中遇到问题

2 个答案:

答案 0 :(得分:3)

Java仅根据调用该方法的对象动态调度(选择哪个类提供方法实现)。基于参数类型(重载所必需的)的调度是在编译时静态完成的。

答案 1 :(得分:0)

我想在那种情况下,Java无法确定调用编译时的方法,因此需要使用强制转换(因此需要对类型进行运行时检查)来解决它。