是否有一种语言允许动态绑定参数?

Is there a language allowing dynamic binding for arguments?

是否有一种语言允许超类型 A 定义方法 useFoo (Foo foo) 例如 B,派生自 A 定义方法 useFoo(Bar bar),(Bar 派生自 Foo),当使用 B 作为带有 Foo 的 A 是 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" ?
}

我知道有一种方法可以通过 "few" 行(例如使用访问者)实现这一点,但我想知道是否有任何(编译)语言允许它。

我承认我想知道这是否可能,相反我不会感到惊讶,是什么阻止了它?

这个概念有更好的名字吗?

编辑:在java中,它被命名为Contravariance。谢谢@Kevinrob

您的问题与以下概念有关:

  1. Covariance:参数可以在 subclasses 中重新定义为原始参数 class 的子class。例如,此约定用于 Eiffel。众所周知,该方法会导致类型安全问题、CAT 调用(CAT = 更改可用性或类型),需要以特殊方式解决这些问题以保持类型系统的稳健性。协变性的有力论据是它与合同很好地结合(例如,与合同设计)。
  2. Multiple dispatch:方法调用不仅依赖于调用目标的类型,还依赖于参数的类型。该页面列出了支持此机制的几种语言。多重分派是一种处理协变和逆变的方法。但是,在设计依赖机制的方法集时必须小心,以避免在 运行 时间执行意外方法。
  3. Generic programming:参数类型不由供应商固定,可以由客户固定。该机制是类型安全的并且没有前两个问题,但它需要客户端显式指定实际的泛型参数,如果此类参数太多,类型声明可能会变得笨拙。现在有很多语言支持它。