说我具有以下特征:
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的成员,但我不知道合适的语法是什么?
答案 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