gpt4 book ai didi

scala - 如何为协变泛型类型参数设置别名

转载 作者:行者123 更新时间:2023-12-04 16:46:21 26 4
gpt4 key购买 nike

以下代码无法编译(在 Scala 2.11 中):

case class CovariantClass[+R](value: R) {
type T = R
def get: R = value
}

object Main {
def main(args: Array[String]): Unit ={
println(CovariantClass[String]("hello").get)
}
}

错误信息是:
Error:(4, 8) covariant type R occurs in invariant position in type R of type T
type T = R
^

为什么我不能为协变类型参数设置别名?如果我删除该行 type T = R ,代码编译并打印 hello ,所以别名似乎是问题所在。不幸的是,这意味着我无法为更复杂的类型创建别名,例如, type T = List[R]也不会编译,尽管 List是协变的。

最佳答案

来自 scala spec :

The right-hand side of a type alias is always in invariant position.



这意味着您不能创建别名 T并指定变体类型 R在右手侧。这同样适用于 List[R] ,因为它也是协变的。

但是,您可以提供带有类型参数的类型别名:
case class CovariantClass[+R](value: R) {
type T[+R] = List[R]
def get: R = value
}

如果您发现自己想要别名类型参数 R ,您可能应该首先将其命名为其他名称。

关于scala - 如何为协变泛型类型参数设置别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26435101/

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