如何在scala中围绕泛型方法包装泛型方法?

时间:2012-11-10 21:01:16

标签: scala generic-method spray-json

我正在尝试包装spray-json解析器,使其返回Option而不是抛出异常。

作为第一步,我只是尝试用自己的方法包装该方法,但是我在使它成为通用方法时遇到了问题。

解析器使用隐式格式对象(为我正在使用的具体类型定义)但是当方法是通用的时,编译器会抱怨:

[error]     Cannot find JsonReader or JsonFormat type class for T
[error]     def parse[T](s: String): T = JsonParser(s).convertTo[T]

以下是相关代码:

case class Person(name: String)

object Protocols {
  implicit val personFormat = jsonFormat1(Person)
}

import spray.json._

object Parser {
  import com.rsslldnphy.json.Protocols._
  // JsonParser(s).convertTo[Person] works fine, but..
  def parse[T](s: String): T = JsonParser(s).convertTo[T]  // .. doesn't
}  

我需要做些什么才能让它发挥作用?

1 个答案:

答案 0 :(得分:5)

您需要传递所需的隐式值,这可以使用“上下文绑定”快捷方式表示法方便地完成:

def parse[T : JsonReader](s: String): T =
  JsonParser(s).convertTo[T]

这相当于:

def parse[T](s: String)(implicit reader: JsonReader[T]): T =
  JsonParser(s).convertTo[T]

请参阅What is a "context bound" in Scala?