Cómo llamar a los parámetros variables de Scala java
El punto aquí es comparar las llamadas de Scala a métodos variables. La llamada básica funciona bien, pero la lista de parámetros pasada a la matriz como variables es ligeramente diferente a la de Java.
Además, puede ver que los métodos variantes de Scala no son exclusivos de Java; también se pueden usar en Java.
Además, si desea pasar una Lista como una lista de variantes, en lugar de tener la lista completa como el primer elemento de la variante, puede llamar al método toArray() de la colección para convertirla en una matriz.
Consulte las siguientes llamadas a métodos de parámetros variables, listas de parámetros y matrices en Java
public class JavaVarArgs {
public static void main(String[] args ) {
foo("a", "b", "c");
foo(new String[] {"d", "e"}); p>
}
public static void foo(String.params) {
System.out.println(params + " : " + params.length);
p>for(String s: params) {
System.out.String;@1a6c5a9e : 2
d
e
Sabemos que Scala y Java pueden llamarse entre sí, así que escribamos un fragmento de código Scala para llamar al método foo()
object ScalaVarArgs {
def main( args: Array[String ]) {
JavaVarArgs.foo(Array[String]("d", "e")) tendrá problemas de compilación
No coinciden los tipos: cadena esperada, actual Array [String]
Java le permite pasar una matriz escrita apropiadamente cuando llama a un método mutable, pero Scala ya no lo permite porque intenta pasar todo el Array[String] como un elemento a foo( ) y el método foo() requiere que el tipo de elemento sea String, por lo que no se puede compilar.
Para que el comportamiento sea consistente con la llamada al método var de Java, lo que Scala puede hacer es agregar una anotación a la llamada diciendo que está pasando los elementos de la matriz uno por uno como un parámetro var, escrito p>
JavaVarArgs.foo(Array[String]("d", "e") :_*)
La salida de esta llamada es
La salida de este call es
El enlace original de este artículo es http://unmi.cc/java-scala-call-varargs-method/, del blog de Unmi, un oropéndola ramificado.
[Ljava.lang.String;@7a718e31 : 2
d
e
Si miras el ejemplo anterior, tenemos suerte porque el compilador te lo dirá. qué ocurre. Los problemas más problemáticos son siempre aquellos en los que se compila pero tiene problemas en tiempo de ejecución.
Porque lo que realmente encontré en mi propia práctica fue un método cuyo tipo de parámetro variable era un objeto, como
public static void foo(Object. .params) {
System.out.Println(params + "") {
En este caso, el compilador le dirá cuál es el problema. println(params + " : " + params.length);
for(Objeto o: params) {
System.out.println(o);
}
Este es un método sin parámetros. p> }
Cambiar los parámetros a Objeto.....params anteriores no cambiará el comportamiento de Java cuando lo llama pasando una matriz, pero hará que la solución de problemas cuando Scala lo llame sea más difícil.
La llamada foo(Array[String]("d", "e") en Scala no causará errores durante la compilación. Después de agregar el código de depuración anterior, encontrará que no importa cuán grande sea la matriz se pasa, La salida es similar
[Ljava.lang.Object;@7814d044 : 1
[Ljava .lang.String;@ea25c1
foo(Array[String]("d", "e") :_*)
Con Descomponer la matriz y pasarla al método foo()
Inicialmente pensé que esto era necesario cuando Scala llamó a los métodos variados de Java, pero luego reimplementé los métodos variados. métodos en Scala
def foo(params: AnyRef*) {
println(params + " : " + params.
for (s <- params. ) { p>
println(s)
}
}
Llámelo desde código Scala, pasando una matriz, si no No quiero que toda la matriz sea un solo elemento. Para usarla, también debe especificar: _* parámetros, de manera similar:
foo(Array[String] ("d", "e"):
Antes de escribir este artículo, creo que esto es una falla en Scala al llamar a métodos variantes, donde: _* parece ser el comportamiento predeterminado, ahora creo que esta es una de las flexibilidades de Scala que proporciona dos formas de hacerlo; pasar matrices a la variante, entonces, ¿por qué Java no usa la matriz como un todo como un elemento de la variante? Scala proporciona dos métodos para pasar la matriz a la variante, entonces, ¿por qué Java no usa la matriz completa como un elemento? elemento de la variante?