2012-04-08 30 views
19

Hay muchos artículos sobre llamadas a varargs Java desde código Scala, pero lo único que pude encontrar al revés fue esta pregunta: Using scala vararg methods in java, que no tiene ningún ejemplo concreto.Cómo usar Scala varargs desde el código Java

Estoy tratando de usar scala.Console desde algún código Java, por la razón de que java.io.Console no funciona en Eclipse, mientras que el Scala sí lo hace. Pero no puedo conseguir el método

def readLine (text: String, args: Any*): String 

para trabajar, ya que parece estar esperando un scala.collection.Seq[Any] para el segundo argumento, y no veo cómo crear un Seq en Java. ¿Cómo puedo solucionar esto?

cosas que he intentado:

1) Usando nula

// Java 
String s = scala.Console.readLine("Enter text: ", null); 

- se ven recompensados ​​con una NullPointerException.

2) Sustitución de la null con scala.collection.Seq.empty(), pero los informes javac todo tipo de errores, tales como Seq no tener un método empty.

3) Utilizando el objeto Nil en el objeto de paquete scala.collection.immutable, pero la sintaxis sugirió here, lo que sería scala.collection.immutable.package$Nil$.MODULE$, pero que no se puede resolver.

Por supuesto que podría usar el método readLine() que no toma varargs, pero sería demasiado fácil.

Respuesta

24

Se puede utilizar:

scala.collection.Seq$.MODULE$.empty(); 

de código Java para crear una secuencia vacía. De lo contrario, puede utilizar:

new scala.collection.mutable.ArrayBuffer(); 

para crear un búfer de matriz vacía en la que a continuación, puede añadir elementos y utilizarlo como un argumento a los métodos Scala vararg.

De lo contrario, si diseña una biblioteca Scala con los métodos vararg que desea utilizar desde el código Java, utilice la anotación varargs. Generará una versión Java del método que toma una matriz en lugar de Seq.

scala> class A { 
    | @annotation.varargs def foo(x: Int*) { println(x) } 
    | } 
defined class A 

scala> println(classOf[A].getMethods.toList) 
List(public void $line1.$read$$iw$$iw$A.foo(scala.collection.Seq), public void $line1.$read$$iw$$iw$A.foo(int[]), ...) 

Por encima, la reflexión muestra que hay 2 versiones de método foo generados - uno que toma un Seq[Int] y otro que toma un int[].

+1

He editado la respuesta. – axel22

+0

Genial, eso funciona. Ambos aún muestran errores en Eclipse, pero en realidad compilan. Esto podría haber sido parte del problema. –

Cuestiones relacionadas