【问题标题】:Generic function with implicit argument带有隐式参数的泛型函数
【发布时间】:2013-01-29 11:23:15
【问题描述】:

我正在尝试概括我用于从 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 定义一个写入。这是不可能的,因为我不知道A 最终会成为哪种类型:

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

【问题讨论】:

    标签: scala playframework-2.0


    【解决方案1】:

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

    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)))
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 2017-10-06
      • 2015-11-28
      • 2022-01-04
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多