gpt4 book ai didi

scala - 定义协变和逆变类型的错误

转载 作者:行者123 更新时间:2023-12-04 17:37:17 27 4
gpt4 key购买 nike

我有代码:

class A {
override def toString = "object class A"
}

class B extends A {
override def toString = "object class B"
}

class Cell[+T](init: T) {
private[this] var current: T = init
def get: T = current
def set(x: T) { current = x }
}

val cB = new Cell[B](new B)
println(cB.get)
val cA: Cell[A] = cB
println(cA.get)

但我有错误: def set(x: T) { current = x }

error: covariant type T occurs in contravariant position in type T of value x def set(x: T) { current = x }



请解释

最佳答案

类型的逆变位置是(除其他外)允许您将该类型的实例传递给方法的任何位置。所以所有方法参数类型都处于逆变位置。由于您将 T 声明为协变 ( +T ),编译器将不允许这样做。您唯一的选择是:

  • 制作 T不变量
  • 修改 set 方法,使其返回 Cell 的新实例和 Cell因此变得不可变。
  • 删除 set 方法,也使 Cell不可变

  • 如果编译器允许您在实现时使用 set 方法,那将使类型系统不安全,因为它允许您编写:
    val cs:Cell[String] = new Cell("")
    val ca:Cell[Any] = cs
    ca.set(5)
    val s:String = cs.get //boom

    关于scala - 定义协变和逆变类型的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14278203/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com