私はいくつかの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"))
クラスに移動するだけでエラーが発生する原因は何ですか?
私はエラーをグーグルで調べました、そしてそれはかなり一般的であるようです。
結局、私はトリッキーなインポートが欠落していたことがわかりました:
import collection.JavaConversions._
私が持っていたJavaConverters._
と混同しないでください。
これが他の誰かを助けることを願っています。
問題は、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
メソッドを追加する暗黙的なものが含まれます