代码之家  ›  专栏  ›  技术社区  ›  Hugo Corrêa

协变类型出现在HList中的不变位置

  •  1
  • Hugo Corrêa  · 技术社区  · 7 年前

    以下是我如何定义我的类型特征:

    sealed trait Hierarchy {
      type HListType <: HList
      def toHList : HListType
    
      def toCaseClass[C](implicit gen: Generic[C]{type Repr >: HListType}) = gen.from(toHList)
    }
    
    sealed trait <::[+H <: ElType[_], +T <: Hierarchy] extends Hierarchy {
    
      override type HListType = H :: tail.HListType
    
      val head: H
      val tail: T
    
      override def toHList: HListType = head :: tail.toHList
    
    }
    

    我得到以下错误:

    Hierarchy.scala:26: covariant type H occurs in invariant position in type shapeless.::[H,<::.this.tail.HListType] of type HListType
    

    shapeless.:: 定义两个类型参数都是协变的。

    我正在使用scala 2.11.11和shapeless 2.3.2。有没有办法修复这个错误?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Hugo Corrêa    7 年前

    根据Scala规范:

    类型别名的右侧始终处于不变位置。

    所以问题不是来自HList的定义,而是来自我在类型别名中使用类型参数的事实。

    sealed trait <::[+H, +T <: Hierarchy] extends Hierarchy {
    
      type H_ <: ElType[H]
    
      override type HListType = H_ :: tail.HListType
    
      val head: H_
      val tail: T
    
      override def toHList: HListType = head :: tail.toHList
    
    }
    

    问题消失了。