Java 转换为超类并调用重载方法

Java cast to superclass and call overload method

abstract class A {

    int met(A a) {
        return 0;
    }

    int met(B b) {
        return 1;
    }

    int met(C c) {
        return 2;
    }
}

class B extends A {

    int met(A a) {
        return 3;
    }

    int met(B b) {
        return 4;
    }

    int met(C c) {
        return 5;
    }
}

class C extends B {
    int f() {
        return ((A)this).met((A)this);
    }
}

public class teste {
    public static void main(String args[]) {
        C x = new C();
        System.out.println(x.f());
    }
}

程序将 return 3 而我期待的是 0。为什么方法 f 中的第一个强制转换什么都不做而第二个有效?是不是因为在A和B中类 met方法被重载了,所以使用了静态绑定?

这就是多态性的工作方式。想想这个例子:

A a = new C();
a.met(a);

这将按预期调用正确的方法 B#met(...)。一个对象的 method-tables 不只是因为你改变了你存储 Object 的变量的类型而改变,因为 Object 和它的方法之间的绑定比一个更强在 storage-type 和与之相关的方法之间。第二种类型有效,因为输入的类型被强制转换为 A,因此该方法将其识别为 A(input-storage 的类型比 Object 具有更强的绑定]类型)。