web-dev-qa-db-fra.com

Comment fonctionne la syntaxe de déclaration d'argument tableau Java "..."?

J'écris Java depuis un moment, et aujourd'hui j'ai rencontré la déclaration suivante:

public static void main(String... args) {

}

Notez le "point point point" dans la déclaration de tableau, plutôt que le crochet habituel []. De toute évidence, cela fonctionne. En fait, j'ai écrit un petit test et vérifié que cela fonctionne. J'ai donc tiré la grammaire Java pour voir où se trouve cette syntaxe de déclaration d'argument, mais je n'ai rien trouvé.

Pour les experts, comment cela fonctionne-t-il? Cela fait-il partie de la grammaire? De plus, bien que je puisse déclarer une fonction comme celle-ci, je ne peux pas déclarer un tableau dans le corps d'une fonction comme celui-ci.

Quoi qu'il en soit, connaissez-vous un endroit où cela a été documenté. C'est de la curiosité, et cela ne vaut peut-être pas la peine d'y consacrer du temps, mais j'étais perplexe.

49
Virtually Real

Consultez le Java Language Specification, Third Edition, Chapter 8 (Classes) . Enterré il y a cette pépite:

Si le dernier paramètre formel est un paramètre d'arité variable de type T, il est considéré de définir un paramètre formel de type T []. La méthode est alors une méthode à arité variable. Sinon, c'est une méthode d'arité fixe. Les invocations d'une méthode d'arité variable peuvent contenir des expressions d'argument plus réelles que des paramètres formels. Toutes les expressions d'argument réelles qui ne correspondent pas aux paramètres formels précédant le paramètre d'arité variable seront évaluées et les résultats stockés dans un tableau qui sera transmis à l'invocation de la méthode (§15.12.4.2).

Fondamentalement, le dernier paramètre de tout appel de méthode peut avoir T.... Si c'est le cas, il est converti en T[].

Donc, fondamentalement, ce que vous avez est une façon élégante de reproduire le plus traditionnel

String[] args
30
hvgotcodes

Je crois que cela a été implémenté dans Java 1.5. La syntaxe vous permet d'appeler une méthode avec une liste d'arguments séparés par des virgules au lieu d'un tableau.

public static void main(String... args);
main("this", "is", "multiple", "strings");

est le même que:

public static void main(String[] args);
main(new String[] {"this", "is", "multiple", "strings"});

http://today.Java.net/article/2004/04/13/Java-tech-using-variable-argumentshttp://download.Oracle.com/javase/ 1.5.0/docs/guide/language/varargs.html

35
JohnS

C'est varargs

En termes simples, c'est un Array de Member comme

public setMembers(Member[] members);

Quand utiliser:

Généralement, lors de la conception de l'API, il est bon de l'utiliser lorsque le nombre d'arguments n'est pas fixe.

Un exemple de l'API standard de ceci est String.format(String format,Object... args)

Voir aussi

22
Jigar Joshi
8
icyrock.com

C'est la soi-disant syntaxe varargs. Dans le corps de la méthode, vous pouvez lire le paramètre members comme s'il s'agissait d'un tableau - en fait, il/est/'juste' un tableau.

Cependant, la magie réside dans l'appel de la méthode. Avant l'introduction de la syntaxe varargs, vous appeliez la méthode un peu comme ceci:

setMembers(new Members[] {member1, member2, member3});

Avec la nouvelle syntaxe varargs cependant, vous n'avez plus besoin de créer explicitement le tableau, et vous pouvez passer:

setMembers(member1, member2, member3);

Cela signifie cependant qu'un argument varargs doit être le dernier argument d'une méthode. Quelque chose comme ça n'est donc pas autorisé:

void setMembers(Member ... members, String memberType);

En résumé: c'est un peu de sucre syntaxique, vraiment. Je ne suis pas un expert du fonctionnement interne du compilateur Java, mais je suis à peu près sûr que les méthodes appelant une méthode qui acceptent un paramètre varargs sont reconstruites en méthodes qui construisent un tableau du type donné.

6
fwielstra
4
Justin Niessner

C'est ce qu'on appelle l'argument varadic: une fonction qui prend autant d'arguments (y compris zéro) que vous le souhaitez. Par exemple, main("string1", "string2", "string3") est identique à main({"string1", "string2", "string3"}) si main est déclaré comme void main(String...args).

Voir http://www.Java-tips.org/blog/Java-se/varargs-%E2%80%93-Java-50-addition.html

3
Ming-Tang

Cela signifie que vous pouvez passer zéro ou plusieurs objets Member à la méthode setMembers(). Dans la méthode setMembers, members aura une sémantique de tableau.

3
Brian Topping

Arguments variables . Peut avoir 0 ou plusieurs arguments String.

La fonction peut accéder aux paramètres sous la forme d'un tableau de chaînes.

2
Jan Zyka

Cela signifie que la méthode accepte un nombre variable d'arguments String. Les arguments sont traités comme un tableau et sont donc accessibles par indice, dans l'ordre dans lequel ils sont passés.

0
dj18