2016-04-17 13 views
3

ich ein Merkmal Processor haben, die wie folgt aussieht:Wiedergabe Schreibt mit generischen Typparametern

trait Processor[A] { 
    def process(in: Seq[Byte]): Result[A] 
} 

trait Result[A]{ 
    val ok: Boolean 
    val errorMessage: Option[String] 
    val data: Option[A] 
} 

Eine konkrete Umsetzung:

class StringProc extends Processor[String] { 
    def process(in: Seq[Byte]): StrResult 
} 

case class StrResult(...) extends Result[String] 
object StrResult { 
    implicit val writes = Json.writes[StrResult] 
} 

Wenn eine StringProc Instanz als Typ Processor[String] Verwendung der Rückgabetyp process ist nicht überraschend ist Result[String], nicht StrResult. Leider scheint die Writes[StrResult] in diesem Fall als nutzlos:

Kein Json Serializer für Typen Ergebnis [Zeichenfolge]

Wie kann ich mit dieser Situation umgehen gefunden?

Antwort

5

können Sie versuchen,

object Result { 
    implicit def resWrites[T](implicit nested: Writes[T]): Writes[Result[T]] = OWrites[Result[T]] { res => 
    Json.obj("ok" -> res.ok, "errorMessage" -> res.errorMessage, 
     "data" -> nested.writes(res.data)) 
    } 
} 
+0

Die Linie innerhalb des Objekts gibt mir _no Unapply oder unapplySeq Funktion found_. Vielleicht, weil 'Ergebnis [A]' ein Merkmal und keine Klasse ist? – ceran

+0

Danke. Ich versuche immer noch herauszufinden, wie es funktioniert, aber es funktioniert;) Der Trick ist, dass die verschachtelten Schreibvorgänge automatisch vom Compiler bereitgestellt werden, richtig? – ceran

+0

Es gibt keinen Trick, das ist nur die Standardmethode, mit der der implizite Bereich funktioniert. – cchantep

Verwandte Themen