Comment fonctionne la syntaxe de déclaration des arguments du tableau Java?

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

public static void main(Ssortingng... args) { } 

Notez le “point dot dot” dans la déclaration du tableau, plutôt que le crochet habituel []. Clairement cela fonctionne. En fait, j’ai écrit un petit test et vérifié que cela fonctionnait. Donc, j’ai tiré la grammaire de java pour voir où se trouve cette syntaxe de déclaration d’argument, mais elle n’a 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 ceci.

De toute façon, connaissez-vous un endroit où cela est documenté? C’est la curiosité, et peut-être ne vaut-il pas la peine d’y investir du temps, mais j’ai été déconcerté.

Découvrez la spécification de langage Java, troisième édition, chapitre 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, on considère qu’il définit un paramètre formel de type T []. La méthode est alors une méthode d’arité variable. Sinon, c’est une méthode d’arité fixe. Les invocations d’une méthode d’arity variable peuvent contenir plus d’expressions d’argument réelles que les parameters formels. Toutes les expressions d’argument réelles qui ne correspondent pas aux parameters formels précédant le paramètre variable arity 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 sophistiquée de reproduire les plus traditionnels

 Ssortingng[] args 

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(Ssortingng... args); main("this", "is", "multiple", "ssortingngs"); 

est le même que:

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

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

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 d’utiliser le nombre d’arguments non corrigé.

Exemple de l’API standard de ceci est Ssortingng.format(Ssortingng format,Object... args)

Regarde aussi

  • var-arg-de-object-tableaux-vs-object-tableau-essayant de comprendre-un-scjp-auto-test

C’est la syntaxe de 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, le bit magique consiste à appeler la méthode. Avant que la syntaxe varargs soit introduite, vous appelez 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 transmettre:

 setMembers(member1, member2, member3); 

Cela signifie toutefois 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, Ssortingng memberType); 

Résumé: C’est un peu de sucre syntaxique, vraiment. Je ne suis pas un expert sur le fonctionnement interne du compilateur Java, mais je suis sûr que les méthodes appelant une méthode qui accepte un paramètre varargs sont reconstruites dans des méthodes qui construisent un tableau du type donné.

Vous pourriez vouloir lire sur l’ utilisation des arguments variables (ou varargs) en Java .

C’est ce qu’on appelle l’argument varadic: une fonction qui prend autant d’arguments (y compris zéro) que vous voulez. Par exemple, main("ssortingng1", "ssortingng2", "ssortingng3") est identique à main({"ssortingng1", "ssortingng2", "ssortingng3"}) si main est déclaré comme void main(Ssortingng...args) .

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

Cela signifie que vous pouvez transmettre zéro ou plusieurs objects Member à la méthode setMembers() . Dans la méthode setMembers, les members auront une sémantique de tableau.

Arguments variables Peut avoir 0 ou plusieurs arguments de chaîne.

La fonction peut accéder aux parameters sous la forme d’un tableau de chaînes.

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