2012-07-18 12 views
10

Perché questo non lavoro OK ?:String.Format() prende un array come un unico argomento

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

E questo doesnt ?:

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

Se il metodo String.Format prende un vararg Oggetto?

Compila OK ma quando eseguo questo, String.format() accetta l'oggetto vararg come un unico argomento univoco (il valore toString() della matrice stessa), quindi genera una MissingFormatArgumentException perché non può essere abbinata a il secondo identificatore di stringa (% s).

Come posso farlo funzionare? Grazie in anticipo, qualsiasi aiuto sarà molto apprezzato.

+0

non è sicuro, ma è possibile verificare senza eseguire il cast della matrice di stringhe sull'oggetto? –

risposta

4

Il problema è che dopo il cast su Object, il compilatore non sa che stai passando un array. Prova a trasmettere il secondo argomento a (Object[]) anziché a (Object).

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

O semplicemente non utilizzare un cast a tutti:

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

(Cfr this answer per un po 'più di informazioni.)

+1

Grazie, funziona con il cast di Object []. Il cast è necessario per evitare un avviso di compilazione. Grazie ancora. – mevqz

+1

@Dragurne - Per evitare l'avvertimento del compilatore e il cast, potresti usare 'new Object [] {" John "," Connor "}'. –

12

Utilizzare questa: (mi sento di raccomandare questo modo)

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"})); 

Ma se si utilizza questo modo, si otterrà il seguente avviso: L'argomento di tipo String [] deve essere espressamente cast su Object [] per l'invocazione del formato del metodo varargs (String, Object ...) da digitare String. In alternativa, può essere lanciato su Oggetto per una chiamata varargs

Problemi correlati