请考虑以下事项:
sealed trait baseData {
def weight: Int
def priority: Int
}
case class data1(override val weight: Int, override val priority: Int) extends baseData
如何使用以下签名定义一个将data1
转换为HList的函数?
def toHlist[A <: baseData] (data: A) = {}
我想将特征实例传递给toHlist
函数而不是实际案例类,因为将有多个案例类扩展特征。我也不想硬编码任何字段;我正在寻找一个完全通用的解决方案。
我确信这对Shapeless库是可行的,但是无法弄清楚如何。
修改
toHList
需要能够处理指向案例类实例的baseData
指针,如下所示:
val data: baseData = data1(1,2)
toHlist(data)
原因是我们将有多个案例类扩展baseData
,现在我们将知道哪一个案例要传递到toHlist
直到运行时。
答案 0 :(得分:0)
这可能不是最终答案,但它可以帮助您完善您的问题,
scala> def toHlist[A <: baseData](data: A)(implicit gen: Generic[A]): gen.Repr = gen.to(data)
toHlist: [A <: baseData](data: A)(implicit gen: shapeless.Generic[A])gen.Repr
scala> toHlist(data1(23, 13))
res0: shapeless.::[Int,shapeless.::[Int,shapeless.HNil]] = 23 :: 13 :: HNil