Scala 中参数类型的差异是什么?

What is the variance of argument types in Scala?

我读过有关 Scala 的函数协变return 类型。 但是它的参数类型呢? FunctionX(T1,...,R) 与这一切有什么关系?

如果您查看任何 FunctionX class 的文档,您会发现 return 类型是协变的,而参数类型是逆变的。例如,Function2 具有签名:

Function2[-T1, -T2, +R] extends AnyRef

您可以在类型参数前找到 -+,其中 - 表示逆变,+ 协变。

这意味着给定

class Animal
class Dog extends Animal

然后

Function1[Animal, Dog] <: Function1[Dog, Dog]
Function1[Dog, Dog] <: Function1[Dog, Animal]

但是

Function1[Dog, Animal] </: Function[Dog, Dog]
Function1[Animal, Animal] </: Function[Animal, Dog]

换句话说,函数承诺不少,要求也不少