带隐式参数的泛型函数

时间:2013-01-29 11:23:15

标签: 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实际上最终会成为:

  

找不到类型A的Json反序列化器。尝试为此类型实现隐式写入或格式。

1 个答案:

答案 0 :(得分:12)

通过向自己的方法添加隐式参数列表来调用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)))

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