2016-04-22 8 views
0

オブジェクトの変換を行うためのオブジェクトは、ParsedItemDocumentからjsonまでです。 ParsedItemDocumenttraitです。私の問題は、2番目のスニペットで呼び出される暗黙の変換がコンパイラによって認識されないということです。暗黙の変換が機能するために必要なことは何ですか?今スカラ暗黙の変換が認識されない

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などと宣言されています)。私のアドバイスは、今のところ黙示を忘れて、代わりにスカラの構文と基本概念をマスターすることに集中することです。 – Dima

+0

質問に関連して(ここに乗っているサーチャーのために)質問の本文ではありません:あなたの暗黙的な変換にも暗黙的なパラメータが含まれていれば...暗黙の値を利用できることを忘れないでください。 – bbarker

答えて

1

暗黙的な変換と暗黙のクラスが混在しています。

あなたがタイプParsedItemDocumentのオブジェクトの「方法」としてparsedItemDocumentToJsonStringを使用したい場合は、あなたが行ったように、あなたは、あなたが暗黙の型変換としてそれを宣言すると

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) 
0

に次のコード・スニペットを使用します。

rankedItems.map(t => t._2) 

あなたがすることによってこれをテストすることができます明示的に呼び出す

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

ParsedItemDocumentに余分なメソッドを追加したいのであれば、暗黙的なクラスを使うことができますが、あなたはそれが必要だとは思わないが、あなたのコードはちょっと見た目になります。