java - Java中的协方差和重载

标签 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
}

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

最佳答案

can you please explain the first line last false output, why it is not true?

ab 的编译时类型是 A,因此执行重载解析的编译器确定唯一有效的方法签名是 f (A a),所以它叫它。

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

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

关于java - Java中的协方差和重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11625049/

相关文章:

python - python 中 __truediv__ 的运算符重载

c++ - C++ 协方差/覆盖/循环问题

c# - C# 4.0 中的协变和逆变推理

java.lang.NoClassDefFoundError Windows

java - 使用 JAAS LdapLoginModule 向 ActiveDirectory 进行身份验证时遇到 FailedLoginException

java - 阻止用户离开 OS X 上的处理应用程序?

Java接口(interface)问题

java - 如何在 GraphQL Java 中解析多个模式文件

C# 接口(interface)重载实现

Scala:重载 (Seq[T]) 和 (T*)