5

我是 Scala 的新手,目前正在学习 Scala 中的类型参数,我遇到了以下场景。

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

class A {
...
}

class B extends A {
...
}

所以我可以说B <: A

这是否也意味着List[B] <: List[A]

4

1 回答 1

19

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

  • 不变性:C[A]不是 的子类型,无论和是C[B]什么关系。例如数组等可变数据结构。AB
  • 协方差:B <: A暗示C[B] <: C[A]。示例是不可变的数据结构或函数的返回类型。
  • 逆变:A <: B暗示C[B] <: C[A]。例如,函数的参数类型是逆变的。
于 2012-10-14T10:43:21.707 回答