隱VAL

2015-12-02 74 views
1

我想知道如果有一種方法,以確保同伴對象具有類的隱含Json formatter它是伴隨:隱VAL

trait Entity { 
    val id: Int 
} 

case class Foo(id: Int) extends Entity 

object Foo { 
    implicit val jsonFormatter = Json.format[Foo] 
} 

例如:

trait DAO[A <: Entity] { 
    def get[A](id: Int) = { 
    val docs: JsValue = ??? 
    Json.fromJson[A](docs) 
    } 
} 

在這種情況下,當它試圖將json轉換爲case類時,它不會找到隱式轉換器。任何想法來解決這個問題?

+0

這是編譯時間錯誤,對不對?你還想要什麼? –

+0

是的,它發生在編譯時間。 – Quarktum

回答

3

那麼,如果隱式沒有找到,那麼你已經有了一個編譯器錯誤,並沒有比這更好。但是,如果你正在使用的格式在那裏,遇到了困難,因爲你這樣做是對每一個可能的Entity類型:

trait DAO[A <: Entity] { 
    def get[A](id: Int) = { 
    val docs: JsValue = ??? 
    Json.fromJson[A](docs) 
    } 
} 

您可能希望定義它,這樣的隱性自動發現實際A類:

trait DAO[A <: Entity] { 
    def get[A](id: Int)(implicit formatter: JsFormatter[A]) = { 
    val docs: JsValue = // Use your formatter here instead of ??? 
    Json.fromJson[A](docs) 
    } 
} 
+0

你是魔術師 – Quarktum

+1

謝謝!但爲了以防萬一,沒有魔法。你正在告訴編譯器「爲任何可能的'A <:Entity'找到一個隱含的,這是不可能的(你以後可能會寫新的實體類型)。現在你將責任傳遞給調用者「讓我對你打電話給我的類型A含蓄」,這是編譯器能夠弄清楚的。 –