class Callback{
public void notify(A arg){ ...}
public void notify(B arg){ ...}
private static class B extends A { ...}
public A create() { return new B(...); }
}
Callback callback = new Callback();
A a = new A(...);
A b = callback.create();
callback.notify(a);
callback.notify(b);
我发现在这种情况下,A
重载都会被调用,即使在调试器中它知道a
的类型为B
。这是应该发生的还是内部阶级以某种方式搞砸了?
答案 0 :(得分:4)
在Java中,调用的方法签名是在编译时确定的,而不是在运行时确定的。 Java根据静态确定的参数类型确定调用哪个方法,而不是运行时的实际类型。 a
和b
都是A
类型的引用,因此调用时间public void notify(A arg)
。有关详情,请参阅Method Invocation Expressions。
答案 1 :(得分:1)
这应该发生 - 您正在考虑的是multimethod dispatch,其他一些语言支持但不支持Java。多方法通常要么在运行时需要线性时间方法查找,要么它们需要非常复杂的算法来创建调度表;而不是其中任何一个,Java总是使用声明的类型而不是参数匹配的实际类型,这实现起来要简单得多,并且不会产生超出动态调度的额外运行时成本。