Scala:参数逆变和返回类型是协变的原因吗?

时间:2014-10-14 11:56:20

标签: scala covariance contravariance

在Scala课程的FP中,马丁提到,论证是"逆变"而返回类型是"协变"。我不认为我完全理解这一点 - 有人可以帮助解决这个问题吗?

1 个答案:

答案 0 :(得分:8)

假设Bonobo延伸Animal,您的foo类型的函数Animal => Bonobo。在其他一些地方,您有bar类型的变量Bonobo => Animal。您是否应该被允许将foo分配给bar?肯定的是:

  • foo只需要一个动物作为参数(这是#34;太宽"或者#34;太笼统"与{Bonobo的预期参数类型相比1}},因此逆变),但处理倭黑猩猩没有问题。
  • 你从bar获得了一个倭黑猩猩(这是#34;太窄"或者#34;太特殊"与{{的预期返回类型foo相比1}},因此协变),但这很好,因为Animal的调用者希望处理各种动物

但是你无法改变这个例子,你不能指定一个bar函数,其中bar函数是预期的,因为参数不合适(它可能会得到一种不是倭黑猩猩的动物,并且返回类型也是错误的(你需要一个倭黑猩猩回来,但是得到一种动物,这可能是不同的东西)。

对于所有类似函数的事物(例如方法)都是如此:如果参数类型更通用且返回类型比预期更特殊,则无关紧要。 "反变"和"协变"对于这个简单的事实来说,这只是一个奇特的术语。