隐VAL

2015-12-02 36 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含蓄”,这是编译器能够弄清楚的。 –