以下是我如何定义我的类型特征:
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.:: 定义两个类型参数都是协变的。
shapeless.::
我正在使用scala 2.11.11和shapeless 2.3.2。有没有办法修复这个错误?
根据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 }
问题消失了。