如何使用参数化类型ReadWriter

问题描述 投票:0回答:1

我想迁移到upickle 0.7.1的最新版本。凡我以前各地隐含的读者和作家过去,我相信我现在必须使用一个单一的ReadWriter和明确的陪伴对象定义他们无论如何班我想序列。但我无法弄清楚它是如何工作的一个参数化类型。因此,例如说我有以下的(来自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]]

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

不知道如何推导式...请求[]隐VAL RW:ReadWriter [请求[] = macroRW

...找不到参数evrw隐含值:upickle.default.ReadWriter [请求[INT]]

......没有足够的参数的构造函数MyNewClass:(隐含evrw:upickle.default.ReadWriter [请求[INT]])MyNewClass [请求[INT]]。未指定的值参数evrw。 VAL C2 =新MyNewClass [请求[INT]]

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

scala upickle
1个回答
1
投票

没测试过,但我希望你需要

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

因此,如因为有一个ReadWriter[Int],还有一个ReadWriter[Request[Int]]

(我会感到非常惊讶,如果这不起作用,但是可以肯定在这种情况下做到这一点,而不是手动的macroRW)。

© www.soinside.com 2019 - 2024. All rights reserved.