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

如何在scala中围绕泛型方法包装泛型方法?,scala,generic-method,spray-json,Scala,Generic Method,Spray Json,我试图包装spray json解析器,使其返回一个选项,而不是抛出异常 作为第一步,我只是尝试用我自己的方法来包装这个方法,但是我在使它通用化方面遇到了问题 解析器使用隐式格式对象(为我使用的具体类型定义),但当方法为泛型时,编译器会抱怨: [error] Cannot find JsonReader or JsonFormat type class for T [error] def parse[T](s: String): T = JsonParser(s).convertT

我试图包装spray json解析器,使其返回一个
选项
,而不是抛出异常

作为第一步,我只是尝试用我自己的方法来包装这个方法,但是我在使它通用化方面遇到了问题

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

[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
}  

我需要做什么才能使其工作?

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

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]

请参见Ace,谢谢!我不确定我是否是快捷方式符号的粉丝,所以我想我会坚持使用“更显式-隐式”,可以这么说。我建议您习惯这种符号,因为它在惯用的scala代码中很普遍。实际上,只要你把
JsonReader
看作一个类型类,这个符号就很有意义。看,我不一定要编写惯用的Scala代码。在我看来,Scala多次倾向于简洁而不是清晰,这就是其中之一。