web-dev-qa-db-ja.com

Scala Javaエラー:値フィルタはJava.util.Mapのメンバーではありません。クラス外で機能します

私はいくつかのScala Eclipseのコードをリファクタリングして、このコンパイルエラーに遭遇しようとしています:

値フィルターはJava.util.Mapのメンバーではありません

_import Java.io.File
import com.typesafe.config._

class ConfigLoader  {

    def parseFile( confFile : File) {
        val conf = ConfigFactory.parseFile(confFile).root().unwrapped();        
        for((k,v) <- conf; (dk, dv) = (k, v.toString())) config.param += (dk -> dv);        
    }
_

(configは「param」がString:Stringのマップであるオブジェクトです)

このコードはMain()から正確にプルされたため、次のように正常に機能しました。

_object Main extends Logging {        

    def main(args: Array[String]) {
        //code cropped for readability. 
        //config.param["properties"] is absolute path to a passed-in properties file. 

        val conf = ConfigFactory.parseFile(new Java.io.File(config.param("properties"))).root().unwrapped();

        for((k,v) <- conf; (dk, dv) = (k, v.toString())) config.param+=(dk -> dv);
_

ご覧のとおり、コードはまったく同じです。同じライブラリをインポートしました。現在mainで異なっているのは、ConfigLoaderをインスタンス化してそれを次のように呼び出すことだけです。

cfgLoader.parseFile(config.param("properties"))

クラスに移動するだけでエラーが発生する原因は何ですか?

私はエラーをグーグルで調べました、そしてそれはかなり一般的であるようです。

18
dlite922

結局、私はトリッキーなインポートが欠落していたことがわかりました:

import collection.JavaConversions._

私が持っていたJavaConverters._と混同しないでください。

これが他の誰かを助けることを願っています。

48
dlite922

問題は、Java for-comprehensionの使用に必要なモナドapi(map、flatMapなど)を実装していないscala Mapを使用していることです。

より具体的には、あなたの例では、コンパイラは.filterメソッドがないことについて不平を言っています。これは、(key, value) <- monadなどの直接割り当てではなく、マップの各項目entry <- monadを解凍するためです。ただし、直接割り当てを使用した場合でも、.mapまたは.flatMapが欠落しているというメッセージが表示されます。必要なAPIの詳細については、 この回答を「理解のために準拠させる方法scalaモナド への回答」を参照してください。

あなたの問題に対する最も簡単な解決策は、以下を使用してJavaマップをscalaマップに変換することです。

import scala.collection.JavaConverters._

...
for((k,v) <- conf.asScala) ...

インポートには、Javaマップに.asScalaメソッドを追加する暗黙的なものが含まれます

6
Juh_