scala - 伴生对象中的隐式 val

标签 scala playframework

我想知道是否有一种方法可以确保伴随对象具有其所伴随的类的隐式 Json 格式化程序:

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

最佳答案

好吧,如果没有找到隐式,那么您已经遇到了编译器错误,并且没有比这更好的了。但是,如果您在使用格式化程序时遇到困难,因为您正在为每种可能的 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)
  }
}

关于scala - 伴生对象中的隐式 val,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34048961/

相关文章:

playframework - 如何重命名sbt中的默认项目

PlayFramework 2.0.2 路由中的多个参数

scala - 仅将 "sbt run"的文件夹添加到 unmanagedResourceDirectories

scala - RedisClient失败策略

scala - 为什么 Spark RDD 在 T 中是不变的?

java - Play 2.5 - 在一天中的特定时间运行 Java 方法 (cron)

scala - 为什么在 Spark 中聚合和折叠两个不同的 API?

database - 使用 scala/lift 创建一个数据库和一个简单的登录界面

scala - 如何在多模块 gradle 项目中仅编译已更改(或相关)的模块

java - 如何在java中使用play Framework 2 JsMessages插件的过滤功能?