Scala Java错误:值过滤器不是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()中提取的,它在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 Map不实现使用scala for-comprehension所需的monad api (Map, flatMap,…)。

更具体地说,在你的例子中,编译器抱怨缺少.filter方法。这是因为您解包了map: (key, value) <- monad的每个项目,而不是直接赋值,例如entry <- monad。但是,即使使用直接赋值,它也会抱怨缺少.map.flatMap。有关所需api的详细信息,请参阅"如何使您自己的for-comprehension兼容scala monad"的答案。

最简单的解决方法是将java映射转换为scala映射:

import scala.collection.JavaConverters._
...
for((k,v) <- conf.asScala) ...

导入包含向java map

添加.asScala方法的隐式。

最新更新