icon - Cómo utilizar varala de Scala desde código Java
line border java example (1)
Puedes usar:
scala.collection.Seq$.MODULE$.empty();
desde el código de 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ío en el que luego puede agregar elementos y usarlo como un argumento para los métodos varala de Scala.
De lo contrario, si diseña una biblioteca de Scala con métodos vararg que desea usar desde el código Java, use la anotación varargs
. Generará una versión de Java del método que toma una matriz en lugar de una 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[]), ...)
Arriba, la reflexión muestra que hay 2 versiones del método foo
generado: una que toma una Seq[Int]
y otra que toma una int[]
.
Hay muchos artículos sobre cómo llamar a Java Varargs desde el código de Scala, pero lo único que pude encontrar al revés fue esta pregunta: el uso de los métodos de Scala Vararg en Java , que no tiene ningún ejemplo concreto.
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 Scala lo hace. Pero no consigo el método.
def readLine (text: String, args: Any*): String
para trabajar porque 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 probado:
1) Usando nulo
// Java
String s = scala.Console.readLine("Enter text: ", null);
- obtener recompensado con una NullPointerException
.
2) Reemplazando el null
con scala.collection.Seq.empty()
, pero javac informa todo tipo de errores, como que Seq
no tiene un método empty
.
3) Usar el objeto Nil
en el objeto del paquete scala.collection.immutable
, pero la sintaxis sugerida here , que sería scala.collection.immutable.package$Nil$.MODULE$
, pero eso no se puede resolver.
Por supuesto, podría usar el método readLine()
que no toma varargs, pero sería demasiado fácil.