参数类型不是反变体吗?

Jat*_*tin 17 java scala

我理解术语协方差和反方差.但是有一件小事我无法理解.在课程"Scala中的功能编程"课程中,Martin Ordersky提到:

函数在其参数类型中是逆变的,在它们的返回类型中是共变量的

所以例如在Java中,让我们Dog扩展Animal.让一个函数是:

void getSomething(Animal a){
Run Code Online (Sandbox Code Playgroud)

我有函数调用

Dog d = new Dog();
getSomething(d)
Run Code Online (Sandbox Code Playgroud)

所以基本上发生的事情就是这样Animal a = d.根据维基的协方差是"将范围扩大到狭窄".上面我们正在从狗转变为动物.SO不是参数类型协变而不是逆变?

Tom*_*icz 30

这是Scala中定义函数的方式:

trait Function1 [-T1, +R]  extends AnyRef
Run Code Online (Sandbox Code Playgroud)

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

当某些代码需要Dog => Animal类型函数时Animal => Animal,由于参数的逆转(可以使用更宽泛的类型),您可以提供类型函数.

Dog => Dog由于结果类型的协方差,你也可以提供类型的功能(你可以使用更窄的类型).

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

  • 另一件事是,逆变类型只能出现在你写东西的地方(即参数类型)和协变类型只能出现在你读过的地方(即返回类型) (6认同)