2011-11-29 28 views
9

¿Por qué todos los métodos de Scala vararg, cuando se usan desde Java, parecen aceptar una Seq de variables y no se pueden usar como métodos vararg nativos de Java? ¿Es esto un error?Uso de los métodos de scala vararg en java

Por ejemplo, Buffer tiene el método def append(elems: A*): Unit. Pero en java tiene otra firma: void append(Seq<A>).

Respuesta

7

No es un error. Es una opción de diseño que favorece el uso vararg dentro de Scala sobre la interoperabilidad con Java. Por ejemplo, le permite pasar un List en un método Scala varargs sin tener que convertirlo en un Array en el camino.

Si necesita utilizar Scala varargs de Java, debe crear Scala Seq en su lugar. Puede, por ejemplo, escribir un contenedor Java para obtener una matriz creada automáticamente, y luego usar el método genericWrapArray desde el objeto Predef.

+0

Bueno, sí, eso funciona, pero está muy mal)) – F0RR

+1

Eso es porque usar Java está mal en primer lugar;) –

+0

Para más detalles, ver http://stackoverflow.com/questions/10060377/how-to-use -scala-varargs-from-java-code –

-5

puede fácilmente echar un Seq en varargs usando :_*. Por ejemplo:

val b = collection.mutable.ListBuffer.empty[Int] 
b.append(List(1, 2):_*) 

así que esto evita la duplicación de código en la API de recopilación.

también puede simplemente utilizar appendAll:

b.appendAll((List(1, 2)) 
+0

Bueno, sí, puedo, pero ¿cómo responde eso a mi pregunta?)) – F0RR

+0

Acabo de modificar mi respuesta. – David

+0

El problema no es que Seq no se pueda convertir a varargs en scala. El problema es que tengo que crear un Seq en Java para usar un método con varargs. – F0RR

14

Si controla el código scala, puede usar @varargs para que genere un método de varags compatible con Java, p. Ej. @varargs def append(elems: A*): Unit = {}

Cuestiones relacionadas