15

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

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 オブジェクトを取る場合は?

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

どうすればそれを機能させることができますか?事前に感謝します。どんな助けでも大歓迎です。

4

2 に答える 2

19

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

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

また

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

ただし、この方法を使用すると、次の警告が表示されます。

typeからメソッドを呼び出すには、type の引数をString[]明示的に にキャストする必要があります。あるいは、呼び出しのためにキャストすることもできます。Object[]varargsformat(String, Object...)StringObjectvarargs

于 2012-07-18T06:00:47.423 に答える
9

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

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

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

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

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

于 2012-07-18T05:50:55.140 に答える