请考虑以下代码段:
import shapeless.HList
sealed trait Issue[L <: HList] {
def content: L
def withT[T](t: T): Issue[T :: L]
}
private case class IssueImpl[L <: HList](content: L) extends Issue[L] {
def withT[T](t: T)(implicit ev: SomeEvidenceRegardingT[T]): Issue[T :: L] =
IssueImpl(t :: content)
}
我在这里尝试实现的是建立一个基于HList
的结构,同时限制HList
中可以放置的内容(因此附加到withT
的证据)
问题是Scala编译器抱怨IssueImpl[T :: L]
不符合类型Issue[T :: L]
,但我不能在特征Issue
中使L协变,因为L出现在不变位置。< / p>
有没有办法实现Issue
的合理实施?还是有另一种方法更适合我想做的事情吗?
感谢任何指针。
答案 0 :(得分:1)
我被错误消息误导:这里的问题是::实际上是scala.::
而不是shapeless.::
(它没有导入,只有HList
是)。
所以解决方案是
import shapeless.{HList, ::}
和HList
协方差按预期工作。