2013-02-24 2 views
5

Data la seguente classe caso che deve essere serializzato/deserializzati da/JSON ...come risolvere il riferimento ambiguo di overload applicazione() metodo quando la deserializzazione JSON

import play.api.libs.json 
import play.api.libs.functional.syntax._ 

trait MyTrait(s1: String, s2: String) 

case class MyClass(s1: String, s2: String) extends MyTrait { 

    def this(t: MyTrait) = this(t.s1, t.s2) 
} 

object MyClass { 

    def apply(t: MyTrait) = new MyClass(t) 

    implicit val myClassJsonWrite = new Writes[MyClass] { 
    def writes(c: MyClass): JsValue = { 
     Json.obj(
     "s1" -> c.s1, 
     "s2" -> c.s2 
    ) 
    } 
    } 

    implicit val myClassJsonRead = (
    (__ \ 's1).read[String] ~ 
    (__ \ 's2).read[String] 
)(MyClass.apply _) 
} 

... Ho sempre trovato la seguente messaggio di errore:

[error] /home/j3d/Projects/test/app/models/MyClass.scala:52: ambiguous reference to overloaded definition, 
[error] both method apply in object MyClass of type (s1: String, s2: String)models.MyClass 
[error] and method apply in object MyClass of type (t: MyTrait)models.MyClass 
[error] match expected type ? 
[error] )(MyClass.apply _) 
[error]   ^

... perché non il compilatore dedurre il metodo giusto apply? Come posso risolvere questo errore? Qualsiasi aiuto sarebbe molto apprezzato. Grazie.

risposta

4

è possibile selezionare il metodo corretto in questo modo:

MyClass.apply(_: String, _: String) 

il compilatore non può dedurre il tipo corretto perché si fa riferimento il metodo apply. Poiché li si fa esplicitamente riferimento, il compilatore non farà quella scelta per voi.

Per rendere la sintassi un po 'più leggibile è possibile modificare le compagno di definizione dell'oggetto

object MyClass extends ((String, String) => MyClass) { 

In questo modo si può semplicemente fare riferimento all'oggetto compagna anziché con il metodo ambiguo apply

implicit val myClassJsonRead = (
    (__ \ 's1).read[String] ~ 
    (__ \ 's2).read[String])(MyClass) 
+0

Grazie, è lavori :-) – j3d