Как читать / писать универсальный класс с 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 ответ
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