51 votes

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

J'ai écrit en java pour un certain temps, et aujourd'hui j'ai rencontré la déclaration suivante:

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

}

Notez le "dot dot dot" dans la déclaration de tableau, au lieu de l'habituel crochets []. Clairement, il fonctionne. En fait, j'ai écrit un petit essai et vérifié qu'il fonctionne. Alors, j'ai tiré la java de grammaire pour voir où cette syntaxe de déclaration d'argument est, mais n'a pas trouvé quoi que ce soit.

Donc, pour les experts, comment cela fonctionne? Fait-il partie de la grammaire? Aussi, bien que je ne peux déclarer une fonction comme ça, je ne peux pas déclarer un tableau dans une fonction du corps comme cela.

De toute façon, connaissez-vous un endroit qui a ce documentée. C'est la curiosité, et peut-être pas la peine de tout temps investi en elle, mais j'étais perplexe.

36voto

JohnS Points 421

Je crois que cela a été mis en œuvre en Java 1.5. La syntaxe permet d'appeler une méthode avec une liste séparée par des virgules des arguments 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-arguments http://download.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

30voto

hvgotcodes Points 55375

Découvrez la Java Language Specification, Troisième Édition, le Chapitre 8 (les Classes). Enterré dans il y a cette pépite:

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

Fondamentalement, le dernier paramètre de la méthode, appel T.... Si elle a, il est converti T[].

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

String[] args

22voto

Jigar Joshi Points 116533

C'est - varargs

En terme simple, 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 d'utiliser, lorsque le nombre d'argument n'est pas fixe.

Exemple de l'API standard de ce qui est String.format(String format,Object... args)

Voir Aussi

8voto

icyrock.com Points 13698

7voto

fwielstra Points 1267

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

Cependant, la magie est peu dans l'appel de la méthode. Avant l' varargs de la syntaxe a été introduit, vous feriez appel à la méthode un peu comme ceci:

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

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

setMembers(member1, member2, member3);

Cela ne signifie pourtant pas que l' varargs argument doit être le dernier argument à une méthode. Quelque chose comme ce n'est donc pas autorisé:

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

Résumé: C'est un peu de sucre syntaxique, vraiment. Je ne suis pas expert sur le fonctionnement interne du compilateur Java, mais je suis assez sûr que les méthodes de l'appel d'une méthode qui acceptent varargs paramètre sont reconstruits dans les méthodes que construire un tableau d'un type donné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X