这是我今天早些时候发表的帖子中的一个子问题。
我正在使用HList和Generic,希望在案例类之间执行一些隐式转换。
考虑:
case class A(a: Int, b: Double, c: Boolean)
case class B(b: Double, c: Boolean)
我可以非常简单地在两种类型之间进行转换:
Generic[B].from(Generic[A].to(A(1, 2.0, true)).tail) // B(2.0, true)
我希望能够在Product上使用一种方法,因此我可以执行以下操作:
A(1, 2.0, true).to[B]
我的尝试如下:
object ShapelessTest extends App {
implicit class convert[From <: Product, FromHListT <: HList]
(x: From)(implicit genFrom: Generic.Aux[From, FromHlistT]){
def to[To <: Product, ToHlistT <: HList]
(implicit genTo: Generic.Aux[To, ToHilstT]): To = {
val fromHList = genFrom.to(x)
val toHList = ??? // Manipulate toHList to correspond with type ToHListT
genTo.from(toHList)
}
}
println(C(1, 2.0, true).to[D, Double :: Boolean :: HNil])
}
现在我的代码不理想,有两个原因。
我必须明确提供To HList的类型。
我需要操纵FromHListT实例(也许通过索引选择值),然后确保它的类型为ToHListT。
有人在不指定第二类型参数的情况下如何获得Generic.Aux [T,ToHListT]有任何建议吗?