1

私は得る

型 T の Json シリアライザーが見つかりません。この型の暗黙の Writes または Format を実装してみてください。

import play.api.libs.json._

trait A[T] {
  def foo(t: T) = bar(Json.toJson(t))
}

実際のWritesパラメーターの型にはがありますが、コンパイル エラーが解消されるとは思いません。グーグルで調べたところ、この件に関する私の理解に根本的な何かが欠けているように感じました。どんな助けでも大歓迎です。

4

2 に答える 2

2

この場合、エラー メッセージはあまり明確ではありません。Writesこの型に a を実装する必要はありません。コンパイラに a があることを証明する必要があるだけです。

import play.api.libs.json._

trait A[T] {
  def foo(t: T)(implicit w: Writes[T]) = bar(Json.toJson(t))
}

これは期待どおりに機能します。トレイトにan を含めることもできimplicit def w: Writes[T] ます。この場合、インスタンスを提供するためにインスタンス化子が必要になります。これは、インスタンスなしで an をインスタンス化できないという点でより制限A的ですが、このようなメソッドがたくさんある場合は、構文的に少しきれいになります。すでにAインスタンス化されており、それを呼び出そうとしている後ではなく、実際には制限を早期に適用したい場合がありますfoo

于 2016-10-14T17:49:18.437 に答える
0

提供implicit def writes

import play.api.libs.json._

trait A[T] {
  implicit def writes: Writes[T]
  def foo(t: T) = bar(Json.toJson(t))
}

または書き込みをimplicitパラメーターとして提供しますfoo

import play.api.libs.json._

trait A[T] {
  def foo(t: T)(implicit writes: Writes[T]): JsValue = bar(Json.toJson(t))
}
于 2016-10-14T17:49:23.577 に答える