使用无形状scala合并两个不同case类的字段
我想将两个不同案例类的字段合并到一个案例类中 例如,如果我有以下案例类:使用无形状scala合并两个不同case类的字段,scala,shapeless,Scala,Shapeless,我想将两个不同案例类的字段合并到一个案例类中 例如,如果我有以下案例类: case class Test(name:String, questions:List[Question], date:DateTime) case class Answer(answers:List[Answers]) 我想要一种简洁的、不成形的方式将两者合并为: TestWithAnswers(name:String, questions:List[Question], date:DateTime, answers
case class Test(name:String, questions:List[Question], date:DateTime)
case class Answer(answers:List[Answers])
我想要一种简洁的、不成形的方式将两者合并为:
TestWithAnswers(name:String, questions:List[Question], date:DateTime, answers:List[Answer]).
有没有一个不成形的好答案 您可以使用无形状
通用来执行此操作
val t: Test = ???
val a: Answer = ???
val gt = Generic[Test]
val ga = Generic[Answer]
val gta = Generic[TestWithAnswers]
val ta = gta.from(gt.to(t) ++ ga.to(a))
或者,如果你有一件事的话
val ta = Generic[TestWithAnswers].from(Generic[Test].to(t) ++ Generic[Answer].to(a))
如果t
是Test
的实例,a
是Answer
的实例,ta
将是TestWithAnswers
的实例
快速解释:Generic
可以将案例类转换为GenericHList
表示,也可以将案例类转换为GenericHList表示。因此,根据类的结构,您可以简单地将test和answer转换为hlist,将两个列表连接成一个列表,并从中构建一个TestWithAnswers
实例
下面是一个简单的示例,您可以复制粘贴并在REPL中尝试
import shapeless._
case class A(a: Int)
case class B(a: String)
case class AB(a: Int, b: String)
Generic[AB].from(Generic[A].to(A(42)) ++ Generic[B].to(B("foo")))
// AB(42, "foo")
你是说val ta=gta.from(gt.to(t)+at.to(a))而不是val ta=gta.from(gt.to(t)+gt.to(a))?即使我做了更改,代码仍然无法编译。看起来,++运算符不是gt.to(t)的成员。有什么想法吗?谢谢你对泛型的解释。非常有用。@azuras,是的,拼写错误已经纠正了。你把所有不成形的东西都导入了吗?我在repl中运行了代码,它成功了是的,你肯定是对的。Intellij显示了一个错误,但repl将其显示为正确!谢谢你的帮助。非常好的解决方案如果我们想得到这样的解决方案TestWithAnswers(名称:String,问题:List[Question],答案:List[Answer])
。我们怎么办?