gpt4 book ai didi

scala - Scala类型成员差异

转载 作者:行者123 更新时间:2023-12-03 07:32:50 24 4
gpt4 key购买 nike

请考虑以下简短代码段:

trait Table[+A] {
type RowType = Seq[A]
}

Scala 2.11.7编译器给出以下错误:
covariant type A occurs in invariant position in type Seq[A] of type RowType

为什么将 A本身定义为 Seq[A],却认为 Seqtrait Seq[+A]中处于不变位置?

另外,如果我们忽略该错误,是否可以提供一个用例来说明此类型定义可能存在的问题?

最佳答案

对于任何B <: A,您的Table[B]#RowType将比Table[A]#RowType更具体。更具体的含义并不相同,因此编译器正在将类型别名的参数视为不变位置。

您如何解决此问题。

抽象成员

您可以将类型定义为抽象,这意味着您应该稍后定义它,并且可能会遇到相同的问题,但是在trait Table级别上,这种定义将是正确的

trait Table[+A] {
type RowType <: Seq[A]
}

混凝土高强型

您可以定义参数化类型成员,这可能会导致更改如何使用此类型,但是在大多数情况下应该可以完成这项工作。
trait Table[+A] {
type RowType[+X] = Seq[X]
}

关于类型成员差异

不是我所擅长的 Realm ,但我尝试描述自己的想法。

假设你有
trait Table[+A] {
type RowType = Seq[A]
}

def mkTable[A]: Table[A] = new Table[A] {}

那你就跟随
val tupleTable = mkTable[(String, String)]
val prodTable: Table[Product] = tupleTable

那么 prodTable.RowType是什么?

在您定义的情况下,应为 Seq[Product]。但是等等, prodTabletupleTable是同一对象,因此它们的成员应该相同,因此 prodTable.RowType应该是 Seq[(String, String)]
但是,如果您更改为第一种方法,例如
trait Table[+A] {
type RowType <: Seq[A]
}

def mkTable[A]: Table[A] = new Table[A] {
type RowType = Seq[A]
}

编译器会知道 RowTypeTable[Product]是某种 <: Seq[Product]类型,对于 Seq[(String, String)]是正确的类型,所有歧义都消失了。

关于scala - Scala类型成员差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33458782/

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