varargs sirve que para java variadic-functions

java - sirve - diferencia fn(String... args) vs fn(String[] args)



string[] args c# (6)

En el tamaño del receptor obtendrá una matriz de Cadena. La diferencia solo está en el lado de la llamada.

¿Para qué sirve esta sintaxis?

function(String... args)

¿Es esto lo mismo que escribir

function(String[] args)

con diferencia solo mientras se invoca este método o hay alguna otra característica involucrada en él?


La única diferencia entre los dos es la forma en que llamas a la función. Con String var args puede omitir la creación de la matriz.

public static void main(String[] args) { callMe1(new String[] {"a", "b", "c"}); callMe2("a", "b", "c"); // You can also do this // callMe2(new String[] {"a", "b", "c"}); } public static void callMe1(String[] args) { System.out.println(args.getClass() == String[].class); for (String s : args) { System.out.println(s); } } public static void callMe2(String... args) { System.out.println(args.getClass() == String[].class); for (String s : args) { System.out.println(s); } }


La diferencia es solo cuando se invoca el método. El segundo formulario se debe invocar con una matriz, el primer formulario se puede invocar con una matriz (al igual que la segunda, sí, esto es válido según el estándar Java) o con una lista de cadenas (varias cadenas separadas por comas) o sin argumentos (el segundo siempre debe tener uno, al menos debe pasarse nulo).

Es sintácticamente azúcar. En realidad, el compilador gira

function(s1, s2, s3);

dentro

function(new String[] { s1, s2, s3 });

internamente.


Llamas a la primera función como:

function(arg1, arg2, arg3);

mientras que el segundo:

String [] args = new String[3]; args[0] = ""; args[1] = ""; args[2] = ""; function(args);


con varargs ( String... ) puede llamar al método de esta manera:

function(arg1); function(arg1, arg2); function(arg1, arg2, arg3);

No puedes hacer eso con una matriz ( String[] )


class StringArray1 { public static void main(String[] args) { callMe1(new String[] {"a", "b", "c"}); callMe2(1,"a", "b", "c"); callMe2(2); // You can also do this // callMe2(3, new String[] {"a", "b", "c"}); } public static void callMe1(String[] args) { System.out.println(args.getClass() == String[].class); for (String s : args) { System.out.println(s); } } public static void callMe2(int i,String... args) { System.out.println(args.getClass() == String[].class); for (String s : args) { System.out.println(s); } } }