String.format()将数组作为单个参数

mev*_*vqz 12 java string string-formatting

为什么这样做可行?:

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

这不是吗?:

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

如果方法String.format采用vararg对象?

它编译好但是当我执行它时,String.format()将vararg对象作为单个唯一参数(数组本身的toString()值),因此它抛出一个MissingFormatArgumentException,因为它无法与第二个字符串说明符匹配(%S).

我怎样才能使它工作?在此先感谢,任何帮助将不胜感激.

Nan*_*ale 15

使用这个:(我会推荐这种方式)

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

要么

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

但是如果你使用这种方式,你将得到以下警告:类型String []的参数应该显式地转换为Object [],以便从String类型调用varargs方法格式(String,Object ...).也可以将其转换为Object以进行varargs调用


Ted*_*opp 5

问题是在转换为之后Object,编译器不知道您正在传递数组.尝试将第二个参数转换为(Object[])而不是(Object).

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

或者根本不使用演员表:

System.out.println(String.format(f, new String[]{"John","Connor"}));
Run Code Online (Sandbox Code Playgroud)

(有关更多信息,请参阅此答案.)

  • 谢谢,它适用于 Object[] 演员表。强制转换对于避免编译警告是必要的。再次感谢。 (2认同)
  • @Dragurne - 为避免编译器警告和强制转换,您可以使用 `new Object[]{"John","Connor"}`。 (2认同)