当一个类为子类和超类类型的参数提供重载时,哪个优先?

时间:2013-04-29 16:56:25

标签: java

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。这是应该发生的还是内部阶级以某种方式搞砸了?

2 个答案:

答案 0 :(得分:4)

在Java中,调用的方法签名是在编译时确定的,而不是在运行时确定的。 Java根据静态确定的参数类型确定调用哪个方法,而不是运行时的实际类型。 ab都是A类型的引用,因此调用时间public void notify(A arg)。有关详情,请参阅Method Invocation Expressions

答案 1 :(得分:1)

这应该发生 - 您正在考虑的是multimethod dispatch,其他一些语言支持但不支持Java。多方法通常要么在运行时需要线性时间方法查找,要么它们需要非常复杂的算法来创建调度表;而不是其中任何一个,Java总是使用声明的类型而不是参数匹配的实际类型,这实现起来要简单得多,并且不会产生超出动态调度的额外运行时成本。