是否有一种语言允许超类型A定义了一个方法useFoo(Foo foo),例如B,派生自A定义了一个方法useFoo(Bar bar),(Bar源自Foo),当使用B作为A时, Foo这是一个Bar,它会运行useFoo的最专业版本?是否有一种语言允许动态绑定参数?
Java示例(不工作,不幸):
public class Foo {
}
public class Bar extends Foo {
}
public class A {
void useFoo (Foo foo) {
System.out.println("A");
}
}
public class B extends A {
void useFoo (Bar bar) {
System.out.println("B");
}
}
public static void main(String[] args) {
A b = new B();
b.useFoo(new Bar()); // actually returns "A", is there one returning "B" ?
}
我知道有一种方法可以做到这一点与“几”线(例如使用访问者),但我想知道,如果任何(编译的)语言都会允许它。
我承认我想知道这是否甚至可能,相反,我不会感到惊讶,什么阻止它?
这个概念有更好的名字吗?
编辑:在java中,它被命名为逆变。谢谢@Kevinrob
在Java中,它是“协方差”和“逆变”,[见更多](http://stackoverflow.com/a/2501513/244702)。 –