scala – 当参数列表相同时,将一个case类转换为另一个case类
发布时间:2020-12-16 19:21:59 所属栏目:安全 来源:网络整理
导读:我有很多类似的案例类,它们意味着不同的东西但具有相同的参数列表. object User { case class Create(userName:String,firstName: String,lastName: String) case class Created(userName:String,lastName: String)}object Group { case class Create(groupN
我有很多类似的案例类,它们意味着不同的东西但具有相同的参数列表.
object User { case class Create(userName:String,firstName: String,lastName: String) case class Created(userName:String,lastName: String) } object Group { case class Create(groupName:String,members: Int) case class Created(groupName:String,members: Int) } 鉴于这种设置,我厌倦了编写采用Create类型的参数并返回Created类型的参数的方法.我有大量的测试用例正是这样做的. 我可以写一个函数将一个case类转换成另一个.此函数将User.Create转换为User.Created def userCreated(create: User.Create) = User.Create.unapply(create).map((User.Created.apply _).tupled).getOrElse(sys.error(s"User creation failed: $create")) 我不得不为Group编写另一个这样的函数. def transform[A,B](a: A):B 此外,这个功能不应该破坏减少样板的目的.如果更容易使用,请随意为功能建议不同的签名. 解决方法
为了记录,这里是我设法实现的最简单的类型安全语法:
implicit class Convert[A,RA](value: A)(implicit ga: Generic.Aux[A,RA]) { def convertTo[B,RB](gb: Generic.Aux[B,RB])(implicit ev: RA =:= RB) = gb.from(ga.to(value)) } 它可以像这样使用: case class Create(userName: String,lastName: String) case class Created(userName: String,lastName: String) val created = Create("foo","bar","baz").convertTo(Generic[Created]) 或者使用LabelledGeneric实现更好的类型安全: implicit class Convert[A,RA](value: A)(implicit ga: LabelledGeneric.Aux[A,RB](gb: LabelledGeneric.Aux[B,RB])(implicit ev: RA =:= RB) = gb.from(ga.to(value)) } val created = Create("foo","baz").convertTo(LabelledGeneric[Created])) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |