我有以下对象用于将对象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
}
}
答案 0 :(得分:1)
您正在混合隐式转换和隐式类。
如果您想使用parsedItemDocumentToJsonString
作为ParsedItemDocument
类型对象的“方法”,那么您需要将隐式定义为
implicit class JSONParsing(item: ParsedItemDocument): String {
def parsedItemDocumentToJsonString = Converters.toJson(item)
}
如果您将其声明为隐式转换,则表示您可以在String
类型的对象上调用ParsedItemDocument
的任何方法,因为该对象将被隐式转换为通过隐式方法获得String
。
此外,声明一个完整的隐式类/转换并不是很好的做法,除非你1)不能将它添加到原始类,或者2)将经常重用转换,并且它会节省大量的代码/可读性。这似乎不是这种情况,因为你只包装在Converters.toJSON
中,这不是很冗长,而且jsut是可读的。
PS:你的“地图”中的语法错误,正确的语法是
val jsonrdd = rankedItems.map(t => t._2.parsedItemDocumentToJsonString)
答案 1 :(得分:-1)
如果您的隐含有效,则应该这样做:
rankedItems.map(t => t._2)
您可以通过明确调用
来测试此问题rankedItems.map(t => parsedItemDocumentToJsonString(t._2))
如果你想为ParsedItemDocument
添加额外的方法,你可以使用隐式类,我认为你不需要它,但你的代码看起来有点像。