伴随对象中的隐式val

时间:2015-12-02 17:17:44

标签: scala playframework

我想知道是否有办法确保伴侣对象具有它所伴随的类的隐式Json formatter

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类时,它将找不到隐式转换器。有什么想法可以解决这个问题吗?

1 个答案:

答案 0 :(得分: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)
  }
}