2012-07-26 25 views
9

Mirando el código en JavaConversions y JavaConverters, no estoy seguro de cuál es la forma "correcta" (con 2.10) para convertir entre las colecciones de Java y Scala (en cualquier dirección).Java <-> Conversiones de Scala Collection, Scala 2.10

Parece que hay muchas anotaciones @deprecated.

¿Se ha publicado una respuesta definitiva del Equipo de Scala (Typesafe?)?

Gracias, John

+0

Ver http://stackoverflow.com/questions/8301947/what-is-the-difference-between-javaconverters-and-javaconversions-in-scala – jond3k

Respuesta

13

No sé de cualquier anuncio, pero sólo debe utilizar siempre JavaConverters, es decir, los que requieren que indique las conversiones con .asScala y .asJava.

Según tengo entendido, JavaConverters se introdujeron en 2.8.1 porque el JavaConversions en 2.8 era peligroso y hacía que fuera fácil convertir cosas accidentalmente donde no lo esperaba.

6

Las dos obras de una manera diferente:

  • Con JavaConverters sus objetos serán PIMPED en una clase que apoyan asScala y asJava, que le permiten convertir su colección mediante programación.

  • Con JavaConversions, una colección de Java/Scala se convertirán automáticamente en caso necesario

El riesgo con este último es obtener conversiones incorrectas o innecesarias que pagan un fallo de funcionamiento . Además, al menos en Scala 2.9 no hay memoria caché de conversión implícita, es decir, si la misma conversión se aplica dos veces dentro de un método, el código de conversión se llama dos veces.

Cuando convierte explícitamente una colección, si la necesita en la versión "Java", evitará llamar dos veces .asScala con el mismo método.

16

Este es el ejemplo del cartel niño por los peligros de import JavaConversions._:

scala> val m = Map(1 -> "one") 
m: scala.collection.immutable.Map[Int,String] = Map(1 -> one) 

scala> m.contains(1) 
res0: Boolean = true 

scala> m.contains("") 
<console>:9: error: type mismatch; 
found : String("") 
required: Int 
       m.contains("") 
         ^

scala> import collection.JavaConversions._ 
import collection.JavaConversions._ 

scala> m.contains("") 
res2: Boolean = false 

En lugar de emitir un error de tipo, el compilador convierte la Scala Map a un java.util.Map, que tiene una firma más flojo que acepte Object.

Cuestiones relacionadas