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是某种类型< ;:Seq [Product],对于??Seq [(String,String)]是正确的,并且所有的ambiguilties都消失了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |