2017-01-09 2 views
1

Ich habe eine Java POJO, die ich in einer Scala App bin mit:Scala kann nicht scheinen, veränderbare Karten in Java Karten zu konvertieren

public class AppRuntimeContext { 
    // Lots of stuff... 
    public Map<Object,Object> contextMap; 

    // Getters & setters, ctors, etc. 
} 

In meiner Scala App:

val ctx : AppRuntimeContext = new AppRuntimeContext() 
val ctxMap : Map[String,Fizz] = Map() 
// Some code that populates 'ctxMap' 
ctx.setContextMap(ctxMap) 

Diese Also versuche ich, durch Zugabe der fo ctxMap zu einem java.util.Map Umwandlung

type mismatch; found : scala.collection.mutable.Map[String,com.me.myapp.Fizz] required: java.util.Map[Object,Object]

: erzeugt einen Compiler-Fehler auf der Setter-Methode llowing Import-Anweisung:

import collection.JavaConversions._ 

und dann durch den Setter Aufruf Wechsel zu:

ctx.setContextMap(mapAsJavaMap(ctxMap)) 

Allerdings, wenn ich das tue ich immer noch einen Compiler-Fehler:

type mismatch; found : scala.collection.mutable.Map[String,com.me.myapp.Fizz] required: scala.collection.Map[Object,Object] Note: String <: Object, but trait Map is invariant in type A. You may wish to investigate a wildcard type such as _ <: Object. (SLS 3.2.10)

Irgendwelche Ideen, was ist verursacht diesen Fehler und was ist das Problem?

+0

Beachten Sie, dass die Verwendung von 'JavaConversions 'veraltet ist. Verwenden Sie stattdessen 'JavaConverters' und den expliziten Aufruf' .asScala'/'.asJava'. – maasg

Antwort

1

Eine Möglichkeit ist, die Karte in einen Map[Object, Object] würfen

ctx.setContextMap(mapAsJavaMap(ctxMap.asInstanceOf[mutable.Map[Object, Object]])) 

Ein besseres würde wahrscheinlich ctxMap als Map[Object, Object] in erster Linie zu erklären, obwohl die Objekte setzen erlauben würde, die nicht konform die erwarteten [String, Fizz] Typen:

val ctxMap : mutable.Map[Object, Object] = mutable.Map() 
// Some code that populates 'ctxMap' 
ctxMap.put("k", Fizz(1)) 

ctx.setContextMap(mapAsJavaMap(ctxMap))