2016-10-14 13 views
1

に期待されているとき、私は型Tが見つかりパラメトリック多型改暗黙のは、Scalaの

ませんJSONシリアライザは、このタイプの暗黙的な書き込みやフォーマットを実装してみましょう。

import play.api.libs.json._ 

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

私は実際パラメータの型のためWritesを持つことになりますが、私はそれがコンパイルエラーをクリアすることを表示されません。何人かのグーグルの後で、私は主題に関する私の理解に欠けている何かがあるかもしれないように感じる。どんな助けもありがとうございます。

import play.api.libs.json._ 

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

この:

+1

からimplicitパラメータとして、私はそれは私が右 'Json.toJson'アムすべきだと思い書き込み? – pamu

+0

@pamuはい、ありがとう!それを改造した。 – juanchito

答えて

2

エラーメッセージが、この場合、あなたはこのタイプのWritesを実装する必要はありませんが非常に明確ではありません、あなたはちょうどあなたがいずれかを持っているコンパイラに証明する必要があります期待どおりに動作します。また、あなたはインスタンスなしAをインスタンス化できないという、より限定的である、インスタンスを提供するために、instantiatorsを必要とする特性でimplicit def w: Writes[T]を、持っている可能性がありますが、あなたのようなメソッドをたくさん持っている場合、それは文法的に少しクリーナーですこれは、あなたが制限ではなく、あなたがすでにAをインスタンス化し、それにfooを呼び出そうとしているんだ後よりも、より早いキックしたい、実際にあります。

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)) 
} 

または提供を提供するには、foo

import play.api.libs.json._ 

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

申し訳ありませんが、これは間違った-であるあなたの第二の例の方法では 'T'は、あなたが望むことはありませんし、非常に紛らわしい問題につながることができます特性、上の1をシャドウします。 –

+0

@TravisBrownが答えを編集しました。 – pamu

+0

を提案してくれてありがとうございます。しかし、それはOPのAのセマンティクスを完全に変えてしまいます。 :) –

関連する問題