2016-07-19 34 views
0

考虑以下几点:斯卡拉:将一个密封特征实例到HList

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

这可能不是最终的答案,但它会帮助你完善你的问题,

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 
+0

谢谢!这与'toHlist(data1(23,13))'一起工作,但如果我们所有的都是一个指向基本特征的指针:'val data:baseData = data1(23,13)','toHlist(data )'。在我的情况下,我不知道哪个case类要传入,直到运行时。那里有任何想法? –

+0

你能否根据以上更新你的问题? –

+0

见上文。谢谢! –