我有一个基本抽象类和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非常清楚要调用哪个函数,并且我在此函数调用中遇到问题
答案 0 :(得分:3)
Java仅根据调用该方法的对象动态调度(选择哪个类提供方法实现)。基于参数类型(重载所必需的)的调度是在编译时静态完成的。
答案 1 :(得分:0)
我想在那种情况下,Java无法确定调用编译时的方法,因此需要使用强制转换(因此需要对类型进行运行时检查)来解决它。