参数类型 co-不是反变体吗?

2022-09-02 20:15:38

我理解术语协方差和逆方差。但有一件小事我无法理解。在coursera的“Scala中的函数式编程”课程中,Martin Ordersky提到:

函数的参数类型是逆变的,返回类型是协变的

例如,在Java中,让扩展.并设一个函数是:DogAnimal

void getSomething(Animal a){

并且我有函数调用作为

Dog d = new Dog();
getSomething(d)

所以基本上正在发生的是.根据wiki的协方差是“将宽转换为窄”。在上面,我们正在从狗到动物。那么,参数类型不是协变的而不是逆变的吗?Animal a = d


答案 1

这就是在Scala中定义函数的方式

trait Function1 [-T1, +R]  extends AnyRef

在英语中,参数是逆变的,结果类型是协变的。这是什么意思?T1R

当某些代码段需要类型的函数时,由于参数的逆变(可以使用更广泛的类型),因此可以提供类型的函数。Dog => AnimalAnimal => Animal

您还可以提供类型的函数,这要归功于结果类型的协方差(您可以使用更窄的类型)。Dog => Dog

这实际上是有道理的:有人想要一个函数将狗转换为任何动物。您可以提供转换任何动物(包括狗)的函数。此外,您的函数只能返回狗,但狗仍然是动物。


答案 2

转换为是将窄转换为宽,因此它不是协方差。DogAnimal


推荐