【问题标题】:Subtyping and type parameters in ScalaScala 中的子类型和类型参数
【发布时间】:2012-10-14 10:39:22
【问题描述】:

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

假设我有 2 个类 AB,其中 BA 的子类型。

class A {
...
}

class B extends A {
...
}

所以我可以说B <: A

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

【问题讨论】:

标签: scala generics variance


【解决方案1】:

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

  • 不变性:C[A]不是C[B]的子类型,不管AB是什么关系。例如数组等可变数据结构。
  • 协方差:B <: A 暗示 C[B] <: C[A]。例如不可变的数据结构或函数的返回类型。
  • 逆变:A <: B 暗示 C[B] <: C[A]。例如,函数的参数类型是逆变的。

【讨论】:

    猜你喜欢
    • 2012-04-11
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2022-12-09
    • 2011-08-29
    • 1970-01-01
    • 2015-09-14
    • 2012-02-07
    相关资源
    最近更新 更多