varargs y el argumento ‘…’

Considere la statement de método:

String.format(String, Object ...) 

El argumento Object ... es solo una referencia a una matriz de Object s. ¿Hay alguna manera de utilizar este método con una referencia a una matriz de Object real? Si paso en una matriz de Object al argumento ... , el valor del argumento resultante será una matriz bidimensional, porque un Object[] es en sí mismo un Object :

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

Entonces, el primer componente de la matriz (que se usa en el método String.format ) será una matriz y generará:

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

y luego un error porque el tamaño de la matriz es 1.

La secuencia audaz es la verdadera pregunta.
Esta es una segunda pregunta: ¿una ... matriz / parámetro tiene un nombre?

De los documentos en varargs :

Los tres períodos posteriores al tipo del parámetro final indican que el argumento final puede pasarse como una matriz o como una secuencia de argumentos.

Entonces puede pasar múltiples argumentos o una matriz.

Lo siguiente funciona bien:

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

Usted puede simplemente pasar una matriz:

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

La situación que está describiendo va a ser bastante rara: la mayoría de las veces, sus artículos varargs serán String , o números, o Widget … será inusual que sean Object (lo que podría ser cualquier cosa) o matrices.

Pero si el argumento varargs es un conjunto de Object s o un tipo de matriz, entonces surge su pregunta: puede pasarle una única matriz y luego, ¿cómo sabrá el comstackdor si quiere pasar una matriz (la que proporcionó)? o una serie de 1 elemento que debe PONER en una matriz para usted?

Una prueba rápida muestra la respuesta:

 public class TestClass { public static void main(String[] 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); } } 

El resultado de la ejecución (sus números exactos variarán:

 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 

Entonces, la respuesta es que en casos ambiguos trata lo que pasaste como la matriz en lugar de crear una nueva matriz para envolverlo. Esto tiene sentido ya que siempre podrías envolverlo en una matriz si querías la otra interpretación.