2013-02-24 4 views
5

Biorąc pod uwagę następujące klasy sprawa, która musi być w odcinkach/rozszeregować do/od JSON ...Jak naprawić niejednoznaczne Odniesienia do przeciążony apply() metodę, gdy deserializacji 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 _) 
} 

... I zawsze uzyskać następujący komunikat o błędzie:

[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]   ^

... dlaczego nie kompilator wywnioskować właściwej apply metody? Jak mogę naprawić ten błąd? Każda pomoc będzie naprawdę doceniona. Dzięki.

Odpowiedz

4

Można wybrać właściwą metodę tak:

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

Kompilator nie można wywnioskować prawidłowy typ bo odwołać metody apply. Ponieważ jawnie się do nich odwołujesz, kompilator nie dokona takiego wyboru za Ciebie.

Aby składnia nieco bardziej czytelne Można również zmienić towarzysz definicja obiektu

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

ten sposób można po prostu odniesienia do obiektu towarzysz zamiast dwuznacznego apply metody

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

Dzięki, to Prace :-) – j3d

Powiązane problemy