小编MrP*_*per的帖子

Scala在解决implicits时如何使用显式类型?

我有以下代码,它使用spray-json通过该parseJson方法将一些JSON反序列化为case类.

根据隐式JsonFormat [MyCaseClass]的定义位置(在线或从伴随对象导入),以及在定义时是否提供显式类型,代码可能无法编译.

我不明白为什么从配对对象导入隐式需要它在定义时具有显式类型,但如果我把它内联,那不是这种情况?

有趣的是,IntelliJ在所有情况下都正确地定位了隐式参数(通过cmd-shift-p).

我正在使用Scala 2.11.7.

Broken Code - 来自伴侣对象的通配符导入,推断类型:

import SampleApp._
import spray.json._

class SampleApp {
  import MyJsonProtocol._
  val inputJson = """{"children":["a", "b", "c"]}"""
  println(s"Deserialise: ${inputJson.parseJson.convertTo[MyCaseClass]}")
}

object SampleApp {
  case class MyCaseClass(children: List[String])

  object MyJsonProtocol extends DefaultJsonProtocol {
    implicit val myCaseClassSchemaFormat = jsonFormat1(MyCaseClass)
  }
}
Run Code Online (Sandbox Code Playgroud)

结果是:

Cannot find JsonReader or JsonFormat type class for SampleAppObject.MyCaseClass
Run Code Online (Sandbox Code Playgroud)

请注意,显式导入myCaseClassSchemaFormat隐式时会发生同样的事情.

工作代码#1 - 来自伴侣对象的通配符导入,显式类型:

将显式类型添加到随播对象中的JsonFormat会导致代码编译:

import SampleApp._
import spray.json._

class SampleApp {
  import MyJsonProtocol._
  val inputJson = """{"children":["a", …
Run Code Online (Sandbox Code Playgroud)

scala implicit spray spray-json

8
推荐指数
1
解决办法
466
查看次数

标签 统计

implicit ×1

scala ×1

spray ×1

spray-json ×1