假设我有以下特征:
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的成员,但是我不知道合适的语法是什么?
发布于 2019-01-25 01:00:18
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,则只需编写
... = macroRWhttps://stackoverflow.com/questions/54350317
复制相似问题