我正在尝试在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"))
有什么想法只是将它移到课堂上会导致错误吗?
我用谷歌搜索了这个错误,它看起来很通用。
答案 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