如何将 ReadWriter 用于参数化类型
How to use the ReadWriter for parameterized types
我正在尝试迁移到最新版本的 upickle 0.7.1。在我之前传递隐式 Reader 和 Writers 的地方,我相信我现在必须使用单个 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]]
但这不会为我编译。我收到以下错误:
Don't know how to derive type ...Request[] implicit val rw:
ReadWriter[Request[]] = macroRW
... could not find implicit value for parameter evrw:
upickle.default.ReadWriter[Request[Int]]
...not enough arguments for constructor MyNewClass: (implicit evrw:
upickle.default.ReadWriter[Request[Int]])MyNewClass[Request[Int]].
Unspecified value parameter evrw. val c2 = new
MyNewClass[Request[Int]]
迁移旧代码的正确方法是什么?
未测试,但我希望您需要
implicit def rw[T: ReadWriter]: ReadWriter[Request[T]] = macroRW
例如因为有一个ReadWriter[Int]
,还有一个ReadWriter[Request[Int]]
。
(如果这不起作用,我会感到非常惊讶,但在这种情况下,您当然可以手动完成而不是 macroRW
。)
我正在尝试迁移到最新版本的 upickle 0.7.1。在我之前传递隐式 Reader 和 Writers 的地方,我相信我现在必须使用单个 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]]
但这不会为我编译。我收到以下错误:
Don't know how to derive type ...Request[] implicit val rw: ReadWriter[Request[]] = macroRW
... could not find implicit value for parameter evrw: upickle.default.ReadWriter[Request[Int]]
...not enough arguments for constructor MyNewClass: (implicit evrw: upickle.default.ReadWriter[Request[Int]])MyNewClass[Request[Int]]. Unspecified value parameter evrw. val c2 = new MyNewClass[Request[Int]]
迁移旧代码的正确方法是什么?
未测试,但我希望您需要
implicit def rw[T: ReadWriter]: ReadWriter[Request[T]] = macroRW
例如因为有一个ReadWriter[Int]
,还有一个ReadWriter[Request[Int]]
。
(如果这不起作用,我会感到非常惊讶,但在这种情况下,您当然可以手动完成而不是 macroRW
。)