2012-07-18 18 views
10

Por esto el trabajo bien ?:String.Format() toma una matriz como un solo argumento

String f = "Mi name is %s %s."; 
System.out.println(String.format(f, "John", "Connor")); 

Y ésto no ?:

String f = "Mi name is %s %s."; 
System.out.println(String.format(f, (Object)new String[]{"John","Connor"})); 

Si el método String.Format toma una vararg ¿Objeto?

Compila OK pero cuando ejecuto esto, String.format() toma el objeto vararg como único argumento único (el valor toString() de la matriz misma), por lo que arroja una excepción MissingFormatArgumentException porque no puede coincidir con el segundo especificador de cadena (% s).

¿Cómo puedo hacer que funcione? Gracias de antemano, cualquier ayuda será muy apreciada.

+0

no estoy seguro, pero ¿puedes verificar sin enviar la matriz de cadenas al objeto? –

Respuesta

4

El problema es que después del lanzamiento al Object, el compilador no sabe que está pasando una matriz. Pruebe a enviar el segundo argumento al (Object[]) en lugar de (Object).

System.out.println(String.format(f, (Object[])new String[]{"John","Connor"})); 

o simplemente no utilizar un yeso en absoluto:

System.out.println(String.format(f, new String[]{"John","Connor"})); 

(Ver this answer para un poco más de información.)

+1

Gracias, funciona con Object [] cast. El lanzamiento es necesario para evitar una advertencia de compilación. Gracias de nuevo. – mevqz

+1

@Dragurne - Para evitar la advertencia del compilador y el lanzamiento, puede usar 'new Object [] {" John "," Connor "}'. –

12

Utilice esta: (recomendaría esta manera)

String f = "Mi name is %s %s."; 
System.out.println(String.format(f, (Object[])new String[]{"John","Connor"})); 

O

String f = "Mi name is %s %s."; 
System.out.println(String.format(f, new String[]{"John","Connor"})); 

Pero si utiliza de esta manera, recibirá la siguiente advertencia: El argumento de tipo String [] debería ser lanzado explícitamente a Object [] para la invocación del formato del método varargs (String, Object ...) desde tipo String. Como alternativa, se puede convertir en Objeto para una invocación varargs

Cuestiones relacionadas