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

时间:2014-07-25 17:01:58

标签: java scala map functional-programming list-comprehension

我正在尝试在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"))

有什么想法只是将它移到课堂上会导致错误吗?

我用谷歌搜索了这个错误,它看起来很通用。

2 个答案:

答案 0 :(得分:48)

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

import collection.JavaConversions._

不要与我所拥有的JavaConverters._混淆。

希望这有助于其他人。

答案 1 :(得分:4)

问题是你使用的是一个没有实现使用scala for-comprehension所需的monad api(map,flatMap,...)的java Map。

更具体地说,在您的示例中,编译器抱怨缺少.filter方法。这是因为您解压缩地图的每个项目:(key, value) <- monad而不是直接分配,例如entry <- monad。但即使您确实使用了直接分配,也会抱怨丢失.map.flatMap。有关所需API的详细信息,请参阅this answer to "how to make you own for-comprehension compliant scala monad

您问题的最简单的解决方案是使用以下方法将Java地图转换为scala地图:

import scala.collection.JavaConverters._

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

导入包括将.asScala方法添加到java map

的隐式