无法识别 Scala 隐式转换

Scala implicit conversion not recognised

我有以下对象,用于将对象 ParsedItemDocument 转换为 json 字符串。我应该注意到 ParsedItemDocumenttrait。我的问题是编译器无法识别在第二个片段上调用的隐式转换。要使隐式转换起作用,还需要做些什么吗?

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)