Scala隐式转换无法识别

时间:2016-04-22 09:13:41

标签: scala implicit-conversion

我有以下对象用于将对象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
 }
}

2 个答案:

答案 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添加额外的方法,你可以使用隐式类,我认为你不需要它,但你的代码看起来有点像。