2012-03-09 27 views
8

Me gustaría convertir un mapa scala con un valor booleano en un mapa java con un valor java.lang.Boolean (para interoperabilidad).Conversión del mapa de Scala que contiene un mapa booleano a Java que contiene java.lang.Boolean

import scala.collection.JavaConversions._ 

val a = Map[Int, Boolean]((1, true), (2, false)) 
val b : java.util.Map[Int, java.lang.Boolean] = a 

falla con:

error: type mismatch; 
found : scala.collection.immutable.Map[Int,scala.Boolean] 
required: java.util.Map[Int,java.lang.Boolean] 
val b : java.util.Map[Int, java.lang.Boolean] = a 

Las conversiones implícitas JavaConversions trabajan felizmente con contenedores parametrizados en los mismos tipos, pero no conocen la conversión entre Boole & java.lang.Boolean.

¿Puedo usar la magia JavaConversions para hacer esta conversión, o hay una sintaxis concisa para realizar la conversión sin usar las conversiones implícitas en ese paquete?

Respuesta

8

Mientras JavaConversions convertirá la Scala mapa a un java.util.Map y impl Scala Convierte de forma automática scala.Boolean en java.lang.Boolean, Scala no realizará dos conversiones implícitas para obtener el tipo que desee.

Boolean proporciona un método box para la conversión explícita.

val b: java.util.Map[Int, java.lang.Boolean] = a.mapValues(Boolean.box) 

Si usted está haciendo esto con frecuencia en su código, puede definir su propia conversión implícita para todos Map[T, Boolean].

import scala.collection.JavaConversions._ 

implicit def boolMap2Java[T](m: Map[T, Boolean]): 
    java.util.Map[T, java.lang.Boolean] = m.mapValues(Boolean.box) 

val b: java.util.Map[Int, java.lang.Boolean] = a 
+0

Gracias. ¿Alguna vez Scala encadenará dos conversiones implícitas? – flend

+1

Según [Programación en Scala] (http://amzn.com/0981531644), no. "Regla de uno a la vez: solo se prueba una implícita". – leedm777

8

scala.collection.JavaConversions no lo ayudará con el problema scala.Boolean a java.lang.Boolean. El siguiente trabajo, sin embargo, utilizando el método boolean2Boolean de scala.Predef:

val a = Map[Int, Boolean](1 -> true, 2 -> false) 
val b: java.util.Map[Int, java.lang.Boolean] = a.mapValues(boolean2Boolean) 

o puede utilizar Boolean(boolean value) el constructor de Java:

val a = Map[Int, Boolean](1 -> true, 2 -> false) 
val b: java.util.Map[Int, java.lang.Boolean] = 
     a.mapValues(new java.lang.Boolean(_)) 

o simplemente puede declarar el primer mapa de utilizar el tipo de referencia de Java :

val a = Map[Int, java.lang.Boolean](1 -> true, 2 -> false) 
val b: java.util.Map[Int, java.lang.Boolean] = a 
+0

Te estás perdiendo 'asJava' en ambos casos para convertir el Mapa. –

+1

@Joachim: solo necesitas 'asJava' si estás utilizando' JavaConverters'. La pregunta y mi respuesta utilizan el objeto 'JavaConversions', que realiza la conversión implícitamente. –

+0

Ah, no sabía acerca de JavaConversions, gracias. Escribiste en tu comentario justo arriba pero encontraste el nombre en la respuesta. –

Cuestiones relacionadas