假设我有以下特质:
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的成员,但是我不知道合适的语法是什么?
trait T { val x: Int } object T { implicit val rw: ReaderWriter[T] = ... }
问题是在 ... 部分:如果你有 T 价值,你可以储存它 x :
...
T
x
... = readwriter[Int].bimap[T]( t => t.x, i => new T { val x = i } )
这个解决方案的问题是 A(3) 不会归还 A . 如果不制造 T 仅密封或以其他方式处理一组特定的子类。
A(3)
A
您也可以在编写时包含类名,但如果该类除了 X 存储:
X
class B(override val x: Int, y: String) extends T
如果 T 是 sealed ,你只是写
sealed
... = macroRW