是否存在具有继承的静态类型编程语言,其中方法参数是逆变的?

时间:2011-11-17 00:16:40

标签: inheritance language-agnostic types contravariance

理论上,使用一种方法覆盖子类中父类的方法是合理的,其中参数是父类中参数的超类型,如:

class T
  def foo(s: String) = ...

class S
  override def foo(a: Any) = ...

哪种编程语言支持这个“功能”,它们如何解决诸如子类的单个方法可以覆盖父类的多个方法的问题:

class T
  def foo(s: String) = ...
  def foo(i: Int)    = ...

class S
  override def foo(a: Any) = ...

(假设String的{​​{1}}和Int个子类型。)

2 个答案:

答案 0 :(得分:2)

(不完整的答案)如果我们以OCaml为例,它会回答你问题的标题:这是一个“带有继承的静态类型编程语言,其中方法参数是逆变的”。

至于你问题的第二部分(“他们如何解决像...这样的问题”),不允许超载来削减戈尔迪结。 (重载意味着有两个具有相同名称但不同参数类型的函数,这使得类型推断更加困难)。

答案 1 :(得分:0)

虽然我掌握了概念,但我不知道我是否完全理解你的问题。也就是说,听起来你说派生类应该能够实现使用'less'派生的参数的方法的覆盖。这对我来说似乎是倒退。似乎最重要的方法应该只能使用“更多”派生类型。也许这就是你的意思,或者我错了,但这里引用了C#4.0允许的内容:

(取自http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx

泛型类型参数的方差是多少? 这是C#4.0中的一项新功能。现在,在创建通用接口时,您可以指定在具有不同类型参数的接口实例之间是否存在隐式转换。例如,您可以使用具有比最初指定的更多派生返回类型(协方差)的方法的接口实例,或者具有具有较少派生参数类型(逆向)的方法的接口实例。同样的规则适用于通用代表。