Scala型延迟

Scala型延迟,scala,playframework-2.0,Scala,Playframework 2.0,我正在使用PlayFramework2.1和Scala2.10.1,并希望构建一个通用函数,用自定义案例类列表构造JsArray private def buildJsArray[T](l: List[T])(result: JsArray): JsArray = { l match { case List() => result case x::xs => buildJsArray(xs)(result :+ Json.toJson(x)) // c

我正在使用PlayFramework2.1和Scala2.10.1,并希望构建一个通用函数,用自定义案例类列表构造JsArray

private def buildJsArray[T](l: List[T])(result: JsArray): JsArray = {
    l match {
      case List() => result
      case x::xs => buildJsArray(xs)(result :+ Json.toJson(x)) // compiling error here!
    }
  }
用法:

val applyJsonArray = buildJsArray(List[Apple])(new JsArray())
但是,会引发编译错误:

我确实为特定的case类(即Apple case类)编写了一个Json反序列化程序

如何延迟编译器在运行时而不是在编译时检查x的类型


非常感谢

如何修复错误

您必须向方法中添加以下内容:

def buildJsArray[T](l: List[T])(result: JsArray)(implicit tjs: Writes[T]): JsArray
方法中有这样的参数

必须添加此参数的原因是,只有当您知道
T
是什么时,才知道如何将
T
转换为
json
。这意味着您只有在调用
buildJsArray
时才拥有序列化
T
的方法,并且此参数允许您将此序列化方法传递给方法
buildJsArray

如何构建JSArray

您可以使用的构造函数。它需要一个
序列[JsValue]

new JsArray(l.map{Json.toJson(_)})
已经有一个for
Traversable
,因此您不需要自己的方法
buildJsArray
,您可以使用方法
Json.toJson
,参数类型为
List[t]

添加

您应该看看collections api。它允许您编写更可读、更短的代码:

def buildJsArray[T](l: List[T])(implicit tjs: Writes[T]): JsArray =
  l.foldLeft(new JsArray){ (r, x) => r :+ Json.toJson(x) }

完美答案,无需添加:)在处理JsObject时,不能将泛型OFormat类型用于隐式。您需要为owrite和Reads分别执行一个隐式和一个隐式操作
def buildJsArray[T](l: List[T])(implicit tjs: Writes[T]): JsArray =
  l.foldLeft(new JsArray){ (r, x) => r :+ Json.toJson(x) }