Scala:将密封特征实例转换为HList

时间:2016-07-19 06:18:29

标签: scala generics shapeless

请考虑以下事项:

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直到运行时。

1 个答案:

答案 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