Una API de Java devuelve java.util.Map<java.lang.String,java.lang.Boolean>
;. Me gustaría poner esto en un Map[String,Boolean]
Cómo convertir de java.util.Map a un mapa de Scala
Así que imaginemos que tenemos:
var scalaMap : Map[String,Boolean] = Map.empty
val javaMap = new JavaClass().map() // Returns java.util.Map<java.lang.String,java.lang.Boolean>
No se puede hacer Map.empty ++ javaMap
, ya que el método ++ no sabe acerca de los mapas de Java. Probé:
scalaMap = Map.empty ++ new collection.jcl.MapWrapper[String,Boolean] {
override def underlying = javaMap
}
y:
scalaMap = Map.empty ++ new collection.jcl.MapWrapper[java.lang.String,java.lang.Boolean] {
override def underlying = javaMap
}
Estos ambos fallan para compilar, a causa de los medicamentos genéricos - java.lang.String
no es lo mismo que una cadena Scala.
¿Hay una buena manera de hacer esto, salvo copiar el mapa manualmente?
EDIT: Gracias, todas las buenas respuestas, he aprendido mucho de todas ellas. Sin embargo, cometí un error al publicar un problema más simple aquí que el que realmente tengo. Por lo tanto, si usted me lo permite, voy a generalizar la pregunta - ¿Qué la API devuelve realidad es
java.util.Map<java.lang.String, java.util.Map<SomeJavaEnum,java.lang.String>>
Y necesito mover este a Mapa [Cadena, mapa [SomeJavaEnum, String]]
Se probablemente no parezca demasiada complicación, pero agrega un nivel extra de borrado de tipo, y la única forma que encontré de mover esto a un mapa de Scala fue haciendo una copia profunda (usando algunas de las técnicas que sugeriste a continuación). Alguien alguna sugerencia? De alguna manera, resolví mi problema definiendo una conversión implícita para mis tipos exactos, por lo que al menos la fealdad está oculta en su propio rasgo, pero aún se siente un poco torpe copiando el lote.
Me gusta bastante la respuesta de Conversiones que obtuve del grupo de usuarios de scala. Solo necesito verificar si funciona ... Pero ya es demasiado tarde aquí, así que volveré a publicar pronto ... – George