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

Rus*_*ell 3 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]
Run Code Online (Sandbox Code Playgroud)

这是相关的代码:

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
}  
Run Code Online (Sandbox Code Playgroud)

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

Rég*_*les 5

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

def parse[T : JsonReader](s: String): T =
  JsonParser(s).convertTo[T]
Run Code Online (Sandbox Code Playgroud)

这相当于:

def parse[T](s: String)(implicit reader: JsonReader[T]): T =
  JsonParser(s).convertTo[T]
Run Code Online (Sandbox Code Playgroud)

请参阅Scala中的"上下文绑定"是什么?