2016-04-22 204 views
0

我有以下對象用於將對象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 
} 
} 
+0

有在這個片段中不需要明確coversions。你的編譯錯誤是因爲你的代碼在語法上是錯誤的(括號不平衡,t被聲明爲Long等),而不是隱式轉換。我對你的建議是,現在忘記implicits,並專注於掌握scala語法和基本概念。 – Dima

+0

與問題相關(對於搜索者來說這裏是這個問題),但不是問題的主體:如果你的隱式轉換也需要一個隱式參數......不要忘記有一個隱式值可用。 – bbarker

回答

1

您在混合隱式轉換和隱式類。

如果你想使用parsedItemDocumentToJsonStringParsedItemDocument類型的對象的「方法」,那麼你就需要定義隱含的

implicit class JSONParsing(item: ParsedItemDocument): String { 
    def parsedItemDocumentToJsonString = Converters.toJson(item) 
} 

如果聲明它作爲一個隱式轉換,像你一樣,那麼這意味着您可以在ParsedItemDocument類型的對象上調用String的任何方法,因爲該對象將通過隱式方法隱式轉換爲String

另外,聲明整個隱式類/轉換並不是很好的做法,除非您1)不能將其添加到原始類,或者2)將經常重複使用該轉換,並且會節省大量的代碼/可讀性。這似乎並不是這種情況,因爲你只是在包裝Converters.toJSON,這不是很詳細,只是可讀。

PS:在你的「映射」你的語法是錯誤的,正確的語法是

val jsonrdd = rankedItems.map(t => t._2.parsedItemDocumentToJsonString) 
0

如果您隱正在這個應該這樣做:

rankedItems.map(t => t._2) 

您可以通過測試此請撥打外部電話

rankedItems.map(t => parsedItemDocumentToJsonString(t._2)) 

如果你想給ParsedItemDocument添加一個額外的方法,你可以使用一個隱式類,我不認爲你需要它,但你的代碼看起來有點那樣。