gpt4 book ai didi

scala - Scala 在解析隐式时如何使用显式类型?

转载 作者:行者123 更新时间:2023-12-04 08:42:41 26 4
gpt4 key购买 nike

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

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

我不明白为什么从伴随对象导入隐式需要它在定义时具有显式类型,但是如果我将它内联,情况并非如此?

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

我正在使用 Scala 2.11.7。

损坏的代码 - 从伴随对象导入通配符,推断类型:

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

结果是:
Cannot find JsonReader or JsonFormat type class for SampleAppObject.MyCaseClass

请注意,显式导入 myCaseClassSchemaFormat 也会发生同样的事情。隐含的。

工作代码 #1 - 从伴随对象导入通配符,显式类型:

向伴随对象中的 JsonFormat 添加显式类型会导致代码编译:
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 {
//Explicit type added here now
implicit val myCaseClassSchemaFormat: JsonFormat[MyCaseClass] = jsonFormat1(MyCaseClass)
}
}

工作代码 #2 - 隐式内联,推断类型:

但是,将隐式参数放在使用它们的地方,没有显式类型,也可以工作!
import SampleApp._
import spray.json._

class SampleApp {
import DefaultJsonProtocol._

//Now in-line custom JsonFormat rather than imported
implicit val myCaseClassSchemaFormat = jsonFormat1(MyCaseClass)

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

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

最佳答案

在搜索了 Huw 在他的评论中提到的错误消息后,我找到了 2010 年的 StackOverflow 问题:Why does this explicit call of a Scala method allow it to be implicitly resolved?

这让我想到了 2008 年创建的 Scala 问题,并于 2011 年关闭:https://issues.scala-lang.org/browse/SI-801 (“隐式转换需要显式结果类型?”)

马丁说:

I have implemented a slightly more permissive rule: An implicit conversion without explicit result type is visible only in the text following its own definition. That way, we avoid the cyclic reference errors. I close for now, to see how this works. If we still have issues we migth come back to this.



这成立 - 如果我重新排序破坏代码,以便首先声明伴随对象,然后代码编译。 (还是有点奇怪!)

(我怀疑我没有看到“隐式方法在此处不适用”消息,因为我有一个隐式值而不是转换 - 尽管我在这里假设根本原因与上述相同)。

关于scala - Scala 在解析隐式时如何使用显式类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32438750/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com