2017-01-09 1 views
1

j'ai Java POJO que j'utilise dans une application Scala:Scala ne peut pas sembler convertir les cartes en Java mutables Plans

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

    // Getters & setters, ctors, etc. 
} 

Dans mon application Scala:

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

Cette produit une erreur de compilation sur la méthode setter:

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

donc j'essaie convertir ctxMap un java.util.Map en ajoutant la fo déclaration d'importation llowing:

import collection.JavaConversions._ 

Et puis en changeant l'appel setter à:

ctx.setContextMap(mapAsJavaMap(ctxMap)) 

Cependant quand je fais cela, je reçois encore une erreur de compilation:

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)

Toutes les idées ce qui est provoquant cette erreur et quelle est la solution?

+0

Notez que l'utilisation de 'JavaConversions' est obsolète. Utilisez 'JavaConverters' et l'appel explicite' .asScala'/'.asJava' à la place. – maasg

Répondre

1

Une option est de lancer la carte dans un Map[Object, Object]:

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

Un meilleur serait sans doute de déclarer ctxMap comme Map[Object, Object] en premier lieu, bien que cela permettrait de placer des objets qui ne sont pas conformes à les types [String, Fizz] attendus:

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

ctx.setContextMap(mapAsJavaMap(ctxMap))