【问题标题】:How can I wrap a generic method around a generic method in scala?如何在 scala 中将泛型方法包装在泛型方法周围?
【发布时间】:2012-11-10 21:01:15
【问题描述】:

我正在尝试包装 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
}  

我需要做什么才能让它工作?

【问题讨论】:

    标签: scala generic-method spray-json


    【解决方案1】:

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

    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?

    【讨论】:

    • 王牌,谢谢!不确定我是否喜欢快捷符号,所以我想我会坚持使用“更显式的隐式”,可以这么说。
    • 我建议你习惯这种表示法,因为它在惯用的 scala 代码中很普遍。实际上,只要您将JsonReader 视为类型类,这种表示法就很有意义。见stackoverflow.com/questions/5408861/…
    • 我不一定想编写惯用的 Scala 代码。在我看来,Scala 多次倾向于简洁而不是清晰,这就是其中之一。
    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多