加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala类型成员差异

发布时间:2020-12-16 18:56:58 所属栏目:安全 来源:网络整理
导读:考虑这个简短的片段: 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]中处于不变位置,而Seq本身被定义为特征Seq [A]?
考虑这个简短的片段:

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]中处于不变位置,而Seq本身被定义为特征Seq [A]?

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

解决方法

对于任何B<:A你的表[B] #RowType将比表[A] #RowType更具体.更具体并不意味着相同,因此编译器将类型别名的参数视为不变位置. 你怎么能解决这个问题. 抽象成员 你可以将你的类型定义为抽象,这意味着你应该在以后定义它并且可能会遇到同样的问题,但是在trait Table级别这样的定义将是正确的

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

混凝土高级型

您可以定义参数化类型成员,这可能会导致更改您使用此类型的方式,但在大多数情况下应该完成这项工作.

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

关于类型成员差异

不是我最强的领域,但我试着描述我的想法.

假设你有

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 [产品].但是等等,prodTable和tupleTable是同一个对象,所以它们的成员应该是相同的,所以prodTable.RowType应该是Seq [(String,String)]

但是如果你改成第一种方法就好了

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

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

编译器会知道Table [Product]的RowType是某种类型&lt ;:Seq [Product],对于??Seq [(String,String)]是正确的,并且所有的ambiguilties都消失了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读