如何将ReadWriter用于参数化类型

时间:2019-02-04 19:47:16

标签: scala upickle

我正在尝试迁移到upickle 0.7.1的最新版本。以前我曾经绕过隐式Reader和Writer的地方,我相信我现在必须使用一个ReadWriter并在随同对象中为要序列化的所有case类显式定义它们。但是我无法弄清楚这对于参数化类型如何工作。例如,说升级之前(从0.4.4开始)我有以下内容:

    # remove "query = query.select()", just "query = query.where()"
    if template.quantity_w:
        query = query.where(database.Image.quantity_w == True)
    elif template.quantity_m:
        query = query.where(database.Image.quantity_m == True)
    elif template.quantity_m_w:
        query = query.where(database.Image.quantity_m_w == True)

上面的代码对我来说很好。要迁移此代码,我尝试了以下操作:

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]]

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

  

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

     

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

     

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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