首页 > 解决方案 > 如何用 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 的成员,但我不知道合适的语法是什么?

标签: scalaupickle

解决方案


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

推荐阅读