2009-11-01 15 views
43

en cuenta la declaración de método:varargs y el '...' argumento

String.format(String, Object ...) 

El argumento Object ... es sólo una referencia a una serie de Object s. ¿Hay alguna manera de utilizar este método con una referencia a una matriz real Object? Si paso en una matriz Object al argumento ... - será el valor del argumento resultante sea 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); 

Así que el primer componente de la matriz (que es utilizar en el método String.format), será una matriz y que generará:

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

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

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

+1

Lo siento, tuve que probarlo antes de preguntar ... Creo que tuve este problema hace mucho tiempo. –

Respuesta

52

Desde el docs on varargs:

Los tres períodos después de escribir la última del parámetro indican que la último argumento se puede hacer pasar como un array o como una secuencia de argumentos.

Para que pueda pasar múltiples argumentos o una matriz.

Los siguientes 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 
    } 
} 
+1

Entonces, si desea llamar al método con un solo argumento y resulta ser una matriz, debe envolverlo explícitamente en otro. 'method (new Object [] {array});' –

+8

o do 'method ((Object) array)', que se autoenvolverá – naiad

+0

Estoy mejor que antes de ver estas explicaciones sobre los parámetros vararg, aún así sigo simplemente no lo entiendo – Sizons

11

Usted sólo puede pasar una matriz:

public void foo(String... args) { 
} 

String args[] = new String[10]; 
foo(args); 
+0

No me molestaré en agregar mi propia respuesta, edito en "... se conoce como vararg o argumentos variables y requiere 0..n elementos de elementos especificados" o algo así. – Esko

8

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

Pero si el argumento varargs es un montón de Object s o un tipo de matriz, entonces la pregunta surge: puede pasar que una sola matriz y luego cómo el compilador saber si usted significó 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 (los números exactos variarán:

object1 = [email protected] 
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 

Así que la respuesta es que en los casos ambiguos en que trata a lo que pasa como la matriz en lugar de crear una nueva matriz para envolverla. Esto tiene sentido ya que siempre podría envolverlo en una matriz si quería la otra interpretación.