Java运行时多态性不适用于不同的参数类型

Roc*_*cky 2 java polymorphism overriding overloading

我有3个不同的班级,

public class Parent {
    public void add(double a, double b) {
        System.out.println("Parent class add(double double)");
    }

public class Child extends Parent {
    public void add(long a, long b) {
        System.out.println("Child class add(long long)");
    }
}

public class Test {
    public static void main(String arr[]) {
        Parent parent = new Child();
        parent.add((long)System.currentTimeMillis(), (long)System.currentTimeMillis());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出应该是Child类add(long long),但不是这样,它显示Parent类add(double double)

但是当我在父类中添加子类的add方法时,它显示正确的输出.任何人都可以告诉我原因.

rge*_*man 5

问题是要在编译时选择要调用的方法签名.编译器只知道它parent是类型Parent,因此唯一兼容的签名是add(double, double),因为两个longs都可以扩展为doubles.

Child方法add(long, long)是重载,而不是重写,因此Child继承该add(double, double)方法,并调用它.

如果将该add(long, long)方法添加到Parent类中,那么它将完全匹配,并将通过该add(double, double)方法调用它.