Есть ли язык, допускающий супертип A, определяющий метод useFoo (Foo foo), такой как B, полученный из A, определяющий метод useFoo (Bar bar), (Bar выводится из Foo) при использовании B как A с Foo, который является баром, он будет запускать наиболее специализированную версию 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). –