无法识别 Scala 隐式转换
Scala implicit conversion not recognised
我有以下对象,用于将对象 ParsedItemDocument
转换为 json
字符串。我应该注意到 ParsedItemDocument
是 trait
。我的问题是编译器无法识别在第二个片段上调用的隐式转换。要使隐式转换起作用,还需要做些什么吗?
import scala.language.implicitConversions
import wikidataParser.ParsedItemDocument
object Converters {
def toJson(obj: Any): String = {
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
val out = new StringWriter
mapper.writeValue(out, obj)
return out.toString()
}
implicit def parsedItemDocumentToJsonString
(item: ParsedItemDocument): String = {
Converters.toJson(item)
}
}
现在,我在我的代码中使用以下代码片段
import tools.Converters._
import wikidataParser.ParsedItemDocument
class WikipediaRankingTester2 extends FlatSpec {
"It" should "do something" in {
val jsonrdd:RDD[String]=rankedItems.map(t:Long,ParsedItemDocument)=>
t._2.parsedItemDocumentToJsonString)//compilation error here
}
}
如果你的隐式工作正常,应该这样做:
rankedItems.map(t => t._2)
您可以通过显式调用来测试这个
rankedItems.map(t => parsedItemDocumentToJsonString(t._2))
如果您想向 ParsedItemDocument
添加一个额外的方法,您可以使用隐式 class,我认为您不需要它,但您的代码看起来有点像那样。
您混淆了隐式转换和隐式 classes。
如果您想将 parsedItemDocumentToJsonString
用作 ParsedItemDocument
类型对象的 "method",则需要将隐式定义为
implicit class JSONParsing(item: ParsedItemDocument): String {
def parsedItemDocumentToJsonString = Converters.toJson(item)
}
如果像您一样将其声明为隐式转换,则意味着您可以在 ParsedItemDocument
类型的对象上调用 String
的任何方法,因为该对象将被隐式通过隐式方法转换为 String
。
此外,声明整个隐式 class / 转换不是很好的做法,除非您 1) 不能将它添加到原始 class,或者 2) 非常重用转换通常,它会节省大量 code/readability。这似乎不是这里的情况,因为你只是包装在 Converters.toJSON
中,这不是很冗长,并且只是为了可读。
PS:你的 "map" 中的语法是错误的,正确的语法是
val jsonrdd = rankedItems.map(t => t._2.parsedItemDocumentToJsonString)
我有以下对象,用于将对象 ParsedItemDocument
转换为 json
字符串。我应该注意到 ParsedItemDocument
是 trait
。我的问题是编译器无法识别在第二个片段上调用的隐式转换。要使隐式转换起作用,还需要做些什么吗?
import scala.language.implicitConversions
import wikidataParser.ParsedItemDocument
object Converters {
def toJson(obj: Any): String = {
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
val out = new StringWriter
mapper.writeValue(out, obj)
return out.toString()
}
implicit def parsedItemDocumentToJsonString
(item: ParsedItemDocument): String = {
Converters.toJson(item)
}
}
现在,我在我的代码中使用以下代码片段
import tools.Converters._
import wikidataParser.ParsedItemDocument
class WikipediaRankingTester2 extends FlatSpec {
"It" should "do something" in {
val jsonrdd:RDD[String]=rankedItems.map(t:Long,ParsedItemDocument)=>
t._2.parsedItemDocumentToJsonString)//compilation error here
}
}
如果你的隐式工作正常,应该这样做:
rankedItems.map(t => t._2)
您可以通过显式调用来测试这个
rankedItems.map(t => parsedItemDocumentToJsonString(t._2))
如果您想向 ParsedItemDocument
添加一个额外的方法,您可以使用隐式 class,我认为您不需要它,但您的代码看起来有点像那样。
您混淆了隐式转换和隐式 classes。
如果您想将 parsedItemDocumentToJsonString
用作 ParsedItemDocument
类型对象的 "method",则需要将隐式定义为
implicit class JSONParsing(item: ParsedItemDocument): String {
def parsedItemDocumentToJsonString = Converters.toJson(item)
}
如果像您一样将其声明为隐式转换,则意味着您可以在 ParsedItemDocument
类型的对象上调用 String
的任何方法,因为该对象将被隐式通过隐式方法转换为 String
。
此外,声明整个隐式 class / 转换不是很好的做法,除非您 1) 不能将它添加到原始 class,或者 2) 非常重用转换通常,它会节省大量 code/readability。这似乎不是这里的情况,因为你只是包装在 Converters.toJSON
中,这不是很冗长,并且只是为了可读。
PS:你的 "map" 中的语法是错误的,正确的语法是
val jsonrdd = rankedItems.map(t => t._2.parsedItemDocumentToJsonString)