2008-11-19 28 views
53

¿Cuál es esta sintaxis útil para:diferencia (String args ...) vs fn (String [] args)

function(String... args) 

Es este mismo que escribir

function(String[] args) 

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

Respuesta

78

La única diferencia entre los dos es la forma en que llama 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); 
    } 
} 
6

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

7

Se llama 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); 
8

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

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

Y O no puede hacer eso con una matriz (String[])

+0

mi respuesta favorita –

+0

¡Claro y conciso! –

17

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 convierte

function(s1, s2, s3); 

en

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

internamente.

2
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); 
     } 
    } 
} 
Cuestiones relacionadas