如何使用Upickle读/写泛型类

时间:2019-01-24 15:40:12

标签: scala upickle

说我具有以下特征:

trait T {
    val x: Int
}

def foo(i: Int): T

我想打赌能够使用upickle编写和读取此特征,而不知道具体的类是什么。例如:

upickle.default.write(foo(3))

这样我可以在其他地方将foo定义为:

case class A(x: Int)

def foo(i: Int): T = A(i)

我想我需要将隐式Writer定义为T的成员,但我不知道合适的语法是什么?

1 个答案:

答案 0 :(得分:0)

trait T {
  val x: Int
}
object T {
  implicit val rw: ReaderWriter[T] = ...
}

问题是要放在...部分中的内容:如果您有T值,则只需存储其x

... = readwriter[Int].bimap[T](
  t => t.x,
  i => new T { val x = i }
)

该解决方案的问题在于,读取书面A(3)不会返回A。如果不进行T密封或仅处理一组特定的子类,这实际上是无法解决的。

在编写时还可以包括一个类名,但是如果该类除x之外还需要存储其他字段,则无济于事:

class B(override val x: Int, y: String) extends T

如果T sealed,则只需写

... = macroRW