web-dev-qa-db-fra.com

Un argument de longueur variable est-il traité comme un tableau en Java?

Si je comprends bien, un array se compose d'un nombre fixe d'éléments et d'un variable length argument prend autant d'arguments que vous passez (du même type). Mais sont-ils les mêmes? Puis-je passer l'un là où l'autre est attendu?

16
user3034861

Oui, si vous avez une méthode avec un paramètre varargs comme ceci:

public void foo(String... names)

et vous l'appelez comme ceci:

foo("x", "y", "z");

alors le compilateur convertit simplement cela en:

foo(new String[] { "x", "y", "z"});

Le type du paramètre names est String[], et peut être utilisé comme n'importe quelle autre variable de tableau. Notez qu'il pourrait être toujours null:

String[] nullNames = null;
foo(nullNames);

Voir documentation pour varargs pour plus d'informations.

Cela ne signifie pas que les varargs sont interchangeables avec les tableaux - vous devez toujours déclarer la méthode pour accepter les varargs. Par exemple, si votre méthode a été déclarée comme:

public void foo(String[] names)

alors la première façon de l'appeler ne compilerait pas.

24
Jon Skeet

Ils sont les mêmes, le tableau est utilisé en interne par JVM lors de la création de méthodes varargs. Vous pouvez donc traiter l'argument vararg de la même manière que vous traitez le tableau, donc utilisez par exemple amélioré pour la boucle

public void method(String... args) {
    for(String name : args) {
     //do something
     }
}

et l'appeler comme ça ou même passer un tableau

method("a", "b", "c"); 
method(new String[] {"a", "b", "c"});

Voir ce Nice article pour plus d'explications.

8
Petr Mensik

Un test simple suggérerait qu'ils sont les mêmes:

public class test {

    public static void varArgs(String... strings) {
        for (String s : strings) {
            System.out.println(s);
        }
    }

    public static void main(String[] args) {
        String[] strings = {"string1", "string2", "string3"};
        varArgs(strings);
        varArgs("string4", "string5", "string6");
    }
}

Les sorties:

string1
string2
string3
string4
string5
string6
5
Sam G-H