Scala Java Error:值过滤器不是java.util.Map的成员。课外作品

我试图在Eclipse中重构一些Scala代码,并遇到这个编译错误:

值筛选器不是 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"))

任何想法是什么导致错误只是通过移动到一个类?

我已经谷歌了这个错误,它似乎很通用。


答案 1

事实证明,我错过了一个棘手的导入:

import collection.JavaConversions._

不要与我确实有的混淆。JavaConverters._

希望这有助于其他人。


答案 2

问题是你使用的java Map没有实现使用scala进行理解所需的monad api(map,flatMap,...)。

更具体地说,在您的示例中,编译器抱怨缺少方法。这是因为您解压缩了映射的每个项目:而不是直接赋值,例如 .但是,即使您确实使用了直接分配,它也会抱怨缺少或.请参阅“如何使您拥有符合理解的scala monad”的答案,以获取有关所需api的详细信息。.filter(key, value) <- monadentry <- monad.map.flatMap

最简单的问题解决方案是使用以下方法将java映射转换为scala映射:

import scala.collection.JavaConverters._

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

导入包括将方法添加到 java 映射的隐式.asScala