在Scala中对子类型和类型参数进行分类

Raj*_*Raj 5 generics scala variance

我是Scala的新手,目前正在学习Scala中的类型参数,我遇到了以下情况.

假设我有2类AB,其中B是的子类型A.

class A {
...
}

class B extends A {
...
}
Run Code Online (Sandbox Code Playgroud)

所以我可以说B <: A.

这也意味着List[B] <: List[A]什么?

Kim*_*bel 19

在List的情况下,它B <: A确实意味着List[B] <: List[A],因为List的类型参数是协变的.使类型参数协变意味着它只能出现在List定义中的协变位置,即它只能显示为方法的返回类型,而不能显示为参数的类型."Scala之旅"包含一个关于方差的部分.维基百科也有一篇关于方差的好文章.类型参数方差的三个选项是:

  • 不变性:C[A]不是的一个亚型C[B],不管是什么之间的关系A,并B为.这方面的例子是可变数据结构,例如数组.
  • 协方差:B <: A暗示C[B] <: C[A].示例是不可变数据结构或函数的返回类型.
  • 逆变:A <: B暗示C[B] <: C[A].例如,函数在其参数类型中是逆变的.