0

我正在尝试迁移到最新版本的 upickle 0.7.1。在我之前传递隐式读取器和写入器的地方,我相信我现在必须使用单个读取器并在我想要序列化的任何案例类的伴随对象中显式定义它们。但我无法弄清楚这对于参数化类型是如何工作的。因此,例如说我在升级之前有以下内容(从 0.4.4 开始):

trait OldTrait[T] {

    implicit val evr: Reader[T]
    implicit val evw: Writer[T]

    def save(t: T): String = write(t)
    def restore(str: String): T = read[T](str)
}

class MyOldClass[T](implicit val evr: Reader[T], val evw: Writer[T]) extends OldTrait[T] {
}

case class Request[T](msg: T)

val c1 = new MyOldClass[Request[Int]]

上面的代码对我来说编译得很好。要迁移此代码,我尝试了以下方法:

trait NewTrait[T] {
    implicit val evrw: ReadWriter[T]
}

class MyNewClass[T](implicit val evrw: ReadWriter[T]) extends NewTrait[T] {

}

object Request {
    implicit val rw: ReadWriter[Request[_]] = macroRW
}

val c2 = new MyNewClass[Request[Int]]

但这不会为我编译。我收到以下错误:

不知道如何派生类型 ...Request[ ] implicit val rw: ReadWriter[Request[ ]] = macroRW

... 找不到参数 evrw 的隐式值:upickle.default.ReadWriter[Request[Int]]

...构造函数 MyNewClass 的参数不足:(隐式 evrw:upickle.default.ReadWriter[Request[Int]])MyNewClass[Request[Int]]。未指定的值参数 evrw。val c2 = new MyNewClass[Request[Int]]

迁移旧代码的正确方法是什么?

4

1 回答 1

2

未经测试,但我希望你需要

implicit def rw[T: ReadWriter]: ReadWriter[Request[T]] = macroRW

例如,因为有一个ReadWriter[Int],所以也有一个ReadWriter[Request[Int]]

(如果这不起作用,我会感到非常惊讶,但你当然可以手动而不是macroRW在这种情况下。)

于 2019-02-05T08:19:53.010 回答