我使用无形的案例类转换,
我有2个案例类:
import shapeless._
case class Foo(id: Int, name: String)
case class Bar(id: Int, name: String, price: Double)
val fooGen = Generic[Foo]
val barGen = Generic[Bar]
val foo = Foo(1, "foo")
val fooRepr = fooGen.to(foo)
val additional = fooRepr :+ 1.0
val bar = barGen.from(additional)
这工作正常,但是当我尝试将Bar转换为Foo时
fooGen.from(barGen.to(bar))
我得到一个错误:
found : main.barGen.Repr
[error] (which expands to) shapeless.::[Int,shapeless.:: [String,shapeless.::[Double,shapeless.HNil]]]
[error] required: main.fooGen.Repr
[error] (which expands to) shapeless.::[Int,shapeless.::[String,shapeless.HNil]]
[error] println(fooGen.from(barGen.to(bar)))
是否可以将一个案例类转换成比另一个案例类更多的字段?
最佳答案
与您通过添加元素来调整HList
的Foo
表示的方式类似,您还必须通过删除多余的元素来调整HList
的Bar
表示:
fooGen.from(barGen.to(bar).take(2))
take
使用一个Nat
参数,并且此行代码使用从Int
文字到Nat
类型级自然数的隐式转换。您可以在
HList
的shapeless.syntax.hlists.scala
上找到其他可用的方法。