matrices han existido desde el principio de Java, mientras que varargs son una adición bastante reciente. Por lo tanto, una gran cantidad de código más viejo todavía felizmente utiliza matrices.
Nótese también que llamar a un método vararg genérico con un parámetro de matriz explícita puede silencio causa un comportamiento diferente al esperado:
public <T> void foo(T... params) { ... }
int[] arr = {1, 2, 3};
foo(arr); // passes an int[][] array containing a single int[] element
Por lo tanto - aparte de requerir un gran esfuerzo para obtener ningún beneficio claro - no es siempre deseable para reemplazar los parámetros de matriz heredados con varargs.
no hablar de los casos en los que no se puede, porque hay otro parámetro después de la matriz en la lista de parámetros método:
public void foo(String[] strings, String anotherParam) { ... }
Reordenación de los parámetros puede resolver técnicamente esto, sin embargo, se rompe el código del cliente.
Actualización: Effective Java 2nd. Edición, artículo 42: Utilice varargs juiciosamente explica esto con más detalle, dando también un ejemplo concreto: Arrays.asList()
se adaptó en Java5 para tener parámetros vararg, que
inadvertidamente rompió una gran cantidad de código existente
puede causar sorpresas al usar esto (ahora obsoleta) modismo para imprimir una matriz:
System.out.println(Arrays.asList(myArray));
Update2: doble comprobación de la fuente, y se dice que el problema occurrs con arreglos de tipos primitivos, como int[]
.Antes varargs, código como este:
int[] digits = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 4 };
System.out.println(Arrays.asList(digits));
emitiría un error de compilación, porque sólo los arreglos de tipos de referencia podrían ser convertidos a un List
. Desde varargs, y la modificación de asList
, el código anterior se compila sin advertencias, y el resultado involuntario es algo así como "[[[email protected]]"
.
"pasa una matriz String [] [] que contiene un único elemento String []" no puede reproducir este – user102008
Para aclarar, puede incluir otro parámetro en la firma que no tome varargs, pero [el vararg- el parámetro de aceptación debe ir al último] (http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html). Además, en el ejemplo anterior, al llamar 'foo (arr);' hace que el compilador genere un 'String []' que contiene el 'String []' que pasaste. En otras palabras, genera un 'String' bidimensional array, que es un 'String [] []'. – hotshot309
** Totalmente incorrecto **. Pasar una matriz no primitiva a un parámetro varargs NO dará como resultado una matriz bidimensional. Explicado [aquí] (http://stackoverflow.com/a/2926653/159570) y probado fácilmente. –