Une API Java renvoie un java.util.Map<java.lang.String,java.lang.Boolean>
;. Je voudrais mettre cela en un Map[String,Boolean]
Comment convertir un fichier java.util.Map en Scala Map
imagine Nous avons donc:
var scalaMap : Map[String,Boolean] = Map.empty
val javaMap = new JavaClass().map() // Returns java.util.Map<java.lang.String,java.lang.Boolean>
Vous ne pouvez pas faire Map.empty ++ javaMap
, parce que la méthode ++ ne sait pas sur les cartes Java. J'ai essayé:
scalaMap = Map.empty ++ new collection.jcl.MapWrapper[String,Boolean] {
override def underlying = javaMap
}
et:
scalaMap = Map.empty ++ new collection.jcl.MapWrapper[java.lang.String,java.lang.Boolean] {
override def underlying = javaMap
}
Ces deux ne parviennent pas à compiler, en raison des génériques - java.lang.String
n'est pas la même que celle d'une chaîne de scala.
Existe-t-il une bonne façon de procéder, à moins de copier manuellement la carte?
EDIT: Merci, toutes les bonnes réponses, j'ai beaucoup appris de tous. Cependant, j'ai fait une erreur en publiant un problème plus simple ici que celui que j'ai réellement. Donc, si vous me le permettez, je vais généraliser la question - Qu'est-ce que l'API retourne en fait est
java.util.Map<java.lang.String, java.util.Map<SomeJavaEnum,java.lang.String>>
Et je dois déplacer ce à la carte [String, Carte [SomeJavaEnum, String]]
Il Cela ne semble probablement pas trop compliqué, mais il ajoute un niveau supplémentaire d'effacement de type, et la seule façon de le déplacer vers une carte Scala était de le copier en profondeur (en utilisant certaines des techniques suggérées ci-dessous). Quelqu'un a des allusions? J'ai en quelque sorte résolu mon problème en définissant une conversion implicite pour mes types exacts, donc au moins la laideur est cachée dans son propre trait, mais se sent encore un peu maladroite en profondeur en copiant le sort.
J'aime bien la réponse Conversions que j'ai reçue du groupe d'utilisateurs scala. Juste besoin de vérifier si cela fonctionne ... Mais il est trop tard ici maintenant, donc sera de retour bientôt ... – George