加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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编写另一个这样的函数.
我真正想要的是一个泛型函数,它接受两种类型的case类和一个case类的对象并转换为另一个.就像是,

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]))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读