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