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

Java 当一个类为子类和超类类型的参数提供重载时,哪个获得优先级?,java,Java,我发现在这个场景中,A重载被调用了两次,即使在调试器中它知道A属于B类型。这是应该发生的事情还是内部类把事情搞砸了?在Java中,调用的方法签名是在编译时确定的,而不是在运行时确定的。Java根据静态确定的参数类型而不是运行时的实际类型来确定调用哪个方法。a和b都是a类型的引用,因此调用了public void notify(a arg)。有关详细信息,请参阅。在Java中,调用的方法签名是在编译时确定的,而不是在运行时确定的。Java根据静态确定的参数类型而不是运行时的实际类型来确定调用哪个方

我发现在这个场景中,
A
重载被调用了两次,即使在调试器中它知道
A
属于
B
类型。这是应该发生的事情还是内部类把事情搞砸了?

在Java中,调用的方法签名是在编译时确定的,而不是在运行时确定的。Java根据静态确定的参数类型而不是运行时的实际类型来确定调用哪个方法。
a
b
都是
a
类型的引用,因此调用了
public void notify(a arg)
。有关详细信息,请参阅。

在Java中,调用的方法签名是在编译时确定的,而不是在运行时确定的。Java根据静态确定的参数类型而不是运行时的实际类型来确定调用哪个方法。
a
b
都是
a
类型的引用,因此调用了
public void notify(a arg)
。请参阅更多信息。

这是应该发生的-您所想到的是,其他一些语言支持它,但Java不支持它。多方法通常要么在运行时需要线性时间方法查找,要么需要非常复杂的算法来创建调度表;Java总是使用声明的类型而不是实际的类型来进行参数匹配,这比动态调度更容易实现,并且不会产生任何额外的运行时成本。

这是应该发生的-您想的是,它由一些其他语言支持,但Java不支持。多方法通常要么在运行时需要线性时间方法查找,要么需要非常复杂的算法来创建调度表;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);