2012-09-10 12 views
7

He escrito una API en Scala. Hay un par de puntos de entrada donde espero una lista [SomeTrait] como entrada y devolver una lista [OtherTrait].Llamando al código de Scala desde Java con java.util.List cuando se espera la lista de Scala

Incluí ese Jar en un proyecto de Java para su uso y me encontré con un problema al intentar pasar un java.util.List a un método que esperaba el objeto de la Lista de Scala. Me doy cuenta de que no son lo mismo y que Java no sabe cómo hacer la conversión. Entonces, ¿cómo haces que esto funcione sin esperar que el llamador de Java pase en una lista de Scala?

Respuesta

7

Me encantaría escuchar otras sugerencias, pero esta es la solución que he encontrado y no pude encontrarla en ninguna parte de Google.

Si mi normales Scala de punto de entrada es un método que es algo como esto:

def doSomething(things: List[Thing]): List[Result] = { ... } 

que añadir otro método como este:

//import scala.collection.JavaConversions._ 
import scala.collection.JavaConverters._ 

def doSomething(things: java.util.List[Thing]): java.util.List[Result] = 
    doSomething(things.asScala.toList).asJava 

La conversión explícita en la llamada a la original método es porque terminará en un bucle infinito que se llama a sí mismo.

Este es mi primer intento de publicar y responder mi propia pregunta ... disculpas si me perdí alguna forma estándar de hacer esto. Parecía que valía la pena compartirlo y también vale la pena abrirse a la discusión sobre mejores métodos, ya que soy MUY nuevo en Scala.

EDITAR código actualizado para reflejar sugerencia de @Luigi Plinge

+0

eso es exactamente la respuesta que estaba a punto de publicar –

+4

Usted debe deshacerse de la 'JavaConversions' y convertir el resultado a una lista de Java usando' .asJava' –

+1

+1 a la sugerencia de Luigi, no use JavaConversions, use JavaConverters y los métodos explícitos .asJava/.asScala: las conversiones implícitas pueden hacer cosas extrañas. También evite la sobrecarga, cree un shim/wrapper para ser llamado desde Java. –

Cuestiones relacionadas