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

scala – 无形的案例类转换

发布时间:2020-12-16 18:21:09 所属栏目:安全 来源:网络整理
导读:我使用shapeless进行case类转换, 我有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 = fo
我使用shapeless进行case类转换,
我有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)))

是否有可能将一个案例类转换为更多字段而不是另一个案例类?

解决方法

与调整Foo的HList表示的方式类似,通过添加元素,您还必须通过删除额外元素来调整Bar的HList表示:

fooGen.from(barGen.to(bar).take(2))

take接受一个Nat参数,这行代码使用从Int文字到Nat类型级自然数的隐式转换.

您可以在shapeless.syntax.hlists.scala中找到HLists上提供的其他方法.

(编辑:李大同)

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

    推荐文章
      热点阅读