Java 中的协方差和重载

2022-09-01 07:30:39
class A {
   boolean f(A a) { return true; }
}
class B extends A {
   boolean f(A a) { return false; } // override A.f(A)
   boolean f(B b) { return true; }  // overload A.f
}

void f() {  
   A a = new A();
   A ab = new B();
   B b = new B();
   ab.f(a); ab.f(ab); ab.f(b); //(1) false, false, *false*
   b.f(a); b.f(ab); b.f(b);    //(2) false, false, true
}

你能解释一下第一行最后一个错误输出,为什么它不是真的?


答案 1

你能解释一下第一行最后一个错误输出,为什么它不是真的?

的编译时类型是 ,因此编译器 (执行重载解析) 确定唯一有效的方法签名是 ,因此它调用该签名。abAf(A a)

在执行时,该方法签名的执行方式为因为覆盖它。B.f(A a)B

始终记住,签名是在编译时选择的(重载),但实现是在执行时选择的(重写)。


答案 2

井。。因为你正在调用A型。所以你只能调用 f(A a) 的版本。在 B 中返回 false。