web-dev-qa-db-ja.com

String.format()は、配列を単一の引数として受け取ります

なぜこれがうまくいくのですか?:

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

そして、これはしませんか?:

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

String.formatメソッドがvarargオブジェクトを受け取る場合は?

コンパイルはOKですが、これを実行すると、String.format()はvarargオブジェクトを単一の一意の引数(配列自体のtoString()値)として受け取るため、2番目の文字列指定子と一致できないためMissingFormatArgumentExceptionがスローされます(%s)。

どうすればそれを機能させることができますか?よろしくお願いします。どんな助けでも大歓迎です。

13
mevqz

これを使用してください:(私はこの方法をお勧めします)

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

OR

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

ただし、この方法を使用すると、次の警告が表示されます。String型からvarargsメソッドformat(String、Object ...)を呼び出すには、String []型の引数をObject []に明示的にキャストする必要があります。あるいは、可変引数呼び出しのためにオブジェクトにキャストすることもできます

18

問題は、Objectにキャストした後、コンパイラが配列を渡していることを認識しないことです。 2番目の引数を(Object[])ではなく(Object)にキャストしてみてください。

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

または、キャストをまったく使用しないでください。

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

(もう少し詳しくは、 この回答 を参照してください。)

6
Ted Hopp