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?
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.
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.
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