2014-07-25 10 views
11

Ich versuche, einige Scala Code in Eclipse Refactoring und in dieser Zusammenstellung Fehler laufen:Scala Java Error: Wert Filter ist kein Mitglied von java.util.Map. Werke außerhalb der Klasse

Wertfilter ist kein Mitglied von 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 ist ein Objekt mit "param", um eine Karte von String sein: String)

Dieser Code war ziehen genau von Main(), wo es funktionierte gut wie so:

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); 

Wie Sie sehen können, ist der Code genau der gleiche. Ich habe die gleichen Bibliotheken importiert. Alles, was ich jetzt in Haupt tun anders bin, ist ConfigLoader Instanziieren und es wie so nennen:

cfgLoader.parseFile(config.param("properties"))

Irgendwelche Ideen, was den Fehler verursacht nur durch sie zu einer Klasse zu verschieben?

Ich habe den Fehler gegoogelt und es scheint ziemlich generisch zu sein.

+1

Regel hinzufügen, wenn ich so etwas wie dies sehen Ich lasse den Scala-Compiler entscheiden, ob etwas nicht stimmt, IDEs können nicht vollständig vertraut werden, weil sie noch ziemlich jung sind und einige Bugs haben. Versuchen Sie, Ihren Code von der Konsole zu kompilieren und sehen Sie, ob der Fehler immer wieder auftaucht Frage. –

+0

Haben Sie die Importe in der Datei überprüft, in der Sie 'Main' definiert haben? –

+0

@Ende Eclipse gibt Probleme, wenn es Fehler gibt (Warnung jedes Mal, wenn Sie kompilieren, nicht finden main(), etc.) ja, sie sind die gleichen Importe. – dlite922

Antwort

34

Stellt sich heraus, ich war eine knifflige Import nach allem fehlt:

import collection.JavaConversions._

nicht mit JavaConverters._ verwechselt werden, die ich hatte.

Hoffe das hilft jemand anderem.

+4

Dies ist in Scala 2.12 abgeschrieben, verwenden Sie JavaConvertes und .asScala http://stackoverflow.com/a/38320909/429476 –

+0

es nicht wirklich das Problem zu erklären, nur eine Lösung geben –

0

Das Problem ist, dass Sie eine Java-Map verwenden, die die Monade-API (map, flatMap, ...) nicht implementiert, die erforderlich ist, um Scala zum Verständnis zu verwenden.

Genauer gesagt beschwert sich der Compiler in Ihrem Beispiel über fehlende .filter Methode. Dies liegt daran, dass Sie jedes Element der Karte entpacken: (key, value) <- monad anstelle einer direkten Zuweisung, z. B. entry <- monad. Aber selbst wenn Sie die direkte Zuweisung verwenden würden, würde es sich beschweren, dass .map oder .flatMap fehlt. Einzelheiten zur erforderlichen API finden Sie unter this answer to "how to make you own for-comprehension compliant scala monad.

Die einfachste Lösung für Ihr Problem ist, dass Sie scala Karte zu konvertieren Java mit Karte in:

import scala.collection.JavaConverters._ 

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

Der Import implizit beinhaltet, dass die .asScala Methode Java-Karte