0

upickle 0.7.1 の最新バージョンに移行しようとしています。以前は暗黙的な Reader と Writer を渡していましたが、今度は単一の 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]]

しかし、これは私のためにコンパイルされません。次のエラーが表示されます。

タイプを導出する方法がわからない ...Request[ ] 暗黙の val rw: ReadWriter[Request[ ]] = macroRW

... パラメータ evrw の暗黙的な値が見つかりませんでした: upickle.default.ReadWriter[Request[Int]]

...コンストラクタ MyNewClass の引数が不十分です: (implicit evrw: upickle.default.ReadWriter[Request[Int]])MyNewClass[Request[Int]]. 指定されていない値のパラメーター evrw。val c2 = 新しい MyNewClass[Request[Int]]

古いコードを移行するための正しいアプローチは何ですか?

4

1 に答える 1