在Scala课程的FP中,马丁提到,论证是"逆变"而返回类型是"协变"。我不认为我完全理解这一点 - 有人可以帮助解决这个问题吗?
答案 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
函数是预期的,因为参数不合适(它可能会得到一种不是倭黑猩猩的动物,并且返回类型也是错误的(你需要一个倭黑猩猩回来,但是得到一种动物,这可能是不同的东西)。
对于所有类似函数的事物(例如方法)都是如此:如果参数类型更通用且返回类型比预期更特殊,则无关紧要。 "反变"和"协变"对于这个简单的事实来说,这只是一个奇特的术语。