varargs et l’argument ‘…’

Considérez la déclaration de méthode:

Ssortingng.format(Ssortingng, Object ...) 

L’argument Object ... est juste une référence à un tableau d’ Object . Est-il possible d’utiliser cette méthode avec une référence à un tableau Object réel? Si je passe un tableau d’ Object à l’argument ... – la valeur d’argument résultante sera-t-elle un tableau à deux dimensions – car un Object[] est lui-même un Object :

 Object[] params = ....; // Make the array (for example based on user-input) Ssortingng s = Ssortingng.format("%S has %.2f euros", params); 

Le premier composant du tableau (utilisé dans la méthode Ssortingng.format ) sera donc un tableau et il générera:

 [class.getName() + "@" + Integer.toHexSsortingng(hashCode())] 

puis une erreur car la taille du tableau est 1.

La séquence en gras est la vraie question.
Ceci est une deuxième question: un tableau / paramètre a-t-il un nom?

Des documents sur varargs :

Les trois périodes après le type de paramètre final indiquent que l’argument final peut être passé en tant que tableau ou en tant que séquence d’arguments.

Vous pouvez donc passer plusieurs arguments ou un tableau.

Ce qui suit fonctionne très bien:

 class VarargTest { public static void main(Ssortingng[] args) { Object[] params = {"x", 1.2345f}; Ssortingng s = Ssortingng.format("%s is %.2f", params); System.out.println(s); // Output is: x is 1.23 } } 

Vous pouvez simplement passer un tableau:

 public void foo(Ssortingng... args) { } Ssortingng args[] = new Ssortingng[10]; foo(args); 

La situation que vous décrivez va être assez rare: la plupart du temps, vos objects varargs seront des Ssortingng s, ou des nombres, ou des Widget s … il sera inhabituel qu’ils soient des Object s (ce qui pourrait être n’importe quoi) ou des tableaux.

Mais si l’argument varargs est un tas d’Objects ou un type de tableau, alors votre question se pose: vous pouvez lui passer un seul tableau et comment le compilateur va-t-il savoir si vous voulez passer un tableau (celui que vous avez fourni), ou une série de 1 article qu’il devrait mettre dans un tableau pour vous?

Un test rapide montre la réponse:

 public class TestClass { public static void main(Ssortingng[] args) { Object anObject = new Object(); Object[] anArray = new Object[] {anObject, anObject}; System.out.println("object1 = " + anObject); System.out.println("array1 = " + anArray); takesArgs(); takesArgs(anObject, anObject); takesArgs(anArray); // is this the same as array1? takesArgs(anArray, anArray); } public static void takesArgs(Object... stuff) { System.out.println("The array was " + stuff); } } 

Le résultat de l’exécution (vos chiffres exacts varieront:

 object1 = java.lang.Object@3e25a5 array1 = [Ljava.lang.Object;@19821f The array was [Ljava.lang.Object;@addbf1 The array was [Ljava.lang.Object;@42e816 The array was [Ljava.lang.Object;@19821f The array was [Ljava.lang.Object;@9304b1 

Donc, la réponse est que dans les cas ambigus, il traite ce que vous avez passé en tant que tableau au lieu de créer un nouveau tableau pour l’emballer. Cela a du sens car vous pourriez toujours envelopper vous-même un tableau si vous vouliez l’autre interprétation.