2016-07-19 10 views
0

は、次の点を考慮HListに封印された形質インスタンスを変換しますか?スカラ:</p> <pre><code>sealed trait baseData { def weight: Int def priority: Int } case class data1(override val weight: Int, override val priority: Int) extends baseData </code></pre> <p>にはどうすればHListに<code>data1</code>を変換し、次のシグネチャを持つ関数を定義します

def toHlist[A <: baseData] (data: A) = {} 

Iは、形質を延びる複数のケースのクラスが存在することになるので、代わりに実際のケースクラスのtoHlist関数に形質インスタンスに渡したいです。私もフィールドをハードコードしたくない。私は完全に汎用的なソリューションを探しています。

これはShapelessライブラリで実行できると確信していますが、どのように把握できていません。

EDIT

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 ) '。私の場合は、実行時までどのクラスを渡すべきかわかりません。そこに任意のアイデア? –

+0

上記を踏まえて質問を更新できますか? –

+0

上記を参照してください。ありがとう! –

関連する問題