Как использовать ReadWriter для параметризованных типов - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь перейти на последнюю версию 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 [Request [Int]]

... недостаточно аргументов для конструктора MyNewClass: (неявное evrw: upickle.default.ReadWriter [Запрос [Int]]) MyNewClass [Запрос [Int]].Не указано значение параметра evrw.val c2 = новый MyNewClass [Запрос [Int]]

Каков правильный подход к переносу старого кода?

1 Ответ

0 голосов
/ 05 февраля 2019

Не проверено, но я ожидаю, что вам нужно

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

Так, например, потому что есть ReadWriter[Int], есть также ReadWriter[Request[Int]].

(Я был бы очень удивлен, если бы это не сработало, но вы, конечно, можете сделать это вручную вместо macroRW в этом случае.)

...