型变(逆变)函数
另一个可以帮助理解型变的例子是 Scala 标准库中的 trait Function1[-T, +R]
。 Function1
表示具有一个参数的函数,其中第一个类型参数 T
表示参数类型,第二个类型参数 R
表示返回类型。 Function1
在其参数类型上是逆变的,并且在其返回类型上是协变的。 对于这个例子,我们将使用文字符号 A => B
来表示 Function1[A, B]
。
假设前面使用过的类似 Cat
,Dog
,Animal
的继承关系,加上以下内容:
abstract class SmallAnimal extends Animal
case class Mouse(name: String) extends SmallAnimal
假设我们正在处理接受动物类型的函数,并返回他们的食物类型。 如果我们想要一个 Cat => SmallAnimal
(因为猫吃小动物),但是给它一个 Animal => Mouse
,我们的程序仍然可以工作。 直观地看,一个 Animal => Mouse
的函数仍然会接受一个 Cat
作为参数,因为 Cat
即是一个 Animal
,并且这个函数返回一个 Mouse
,也是一个 SmallAnimal
。 既然我们可以安全地,隐式地用前者代替后者,我们可以说 Animal => Mouse
是 Cat => SmallAnimal
的子类型。
https://docs.scala-lang.org/zh-cn/tour/variances.html
我思故我在