scala - 带有隐式参数的泛型函数

标签 scala playframework-2.0

我试图概括我用于从 Play 操作返回 Json 的函数之一。

我目前这样做:

def JsendOkObj(obj: JsValue) = Ok(Json.obj("status" -> "success", "data" -> obj))

并称之为:
JsendOkObj(Json.toJson(myObj))

我想做一些更像:
def JsendOkObj[A](obj: A) = Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)))

然后像这样调用它:
JsendOkObj(myObj)

哪里Json.toJsondefined作为:
def toJson[A](implicit arg0: Writes[A]): Enumeratee[A, JsValue]

我编译这个的错误是我需要为类型 A 定义一个 Writes| .这是不可能的,因为我不知道是哪种类型 A实际上最终会是:

No Json deserializer found for type A. Try to implement an implicit Writes or Format for this type.

最佳答案

您可以确保隐式 Writes[A]当您调用 toJSon 时将在范围内通过向您自己的方法添加隐式参数列表,如下所示:

def JsendOkObj[A](obj: A)(implicit w: Writes[A]) =
  Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)))

这相当于将类型类实例显式传递给 toJson :
def JsendOkObj[A](obj: A)(implicit w: Writes[A]) =
  Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)(w)))

请注意,您也可以使用 a context bound这里:
def JsendOkObj[A: Writes](obj: A) =
  Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)))

这只是我上面第一个版本的语法糖。

关于scala - 带有隐式参数的泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14581757/

相关文章:

java - 控制台输出是阻塞操作吗?

java - 在 MySQL 数据库中存储微秒

java - 当 Json 在 Play Framework 中太大时,Json 为 null

playframework-2.0 - Play 2.0 应用程序的依赖管理

playframework - 向 Play 2.0 (scala/sbt) 项目添加构建步骤

unit-testing - 如何在IntelliJ idea中运行scala ScalaTest?

java - 如何从Elasticsearch读取数据到Spark?

scala - 如何禁用 sbt/play 的彩色终端输出?

scala - 如何在 Scalatest 中使用 forAll 只生成生成器的一个对象?

java - 重定向到 play framework 2.0 中的外部 url