Java中的协方差和重载

nab*_*bil 33 java overloading covariance

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
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 59

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

编译时类型abA,所以编译器 - 执行重载决策 - 确定唯一有效的方法签名f(A a),因此它调用它.

执行时,执行该方法签名是B.f(A a)因为B它会覆盖它.

始终记住在编译时选择签名(重载),但在执行时选择实现(覆盖).

  • 这是一个很好的解释,非常感谢Jon Skeet (2认同)