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 采用可变参数对象?

它可以编译,但是当我执行此操作时,String.format() 将 vararg 对象作为单个唯一参数(数组本身的 toString() 值),因此它会引发 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 的参数String[]应该显式地转换为从 typeObject[]调用varargs方法。它也可以被强制转换为调用。format(String, Object...)StringObjectvarargs

于 2012-07-18T06:00:47.423 回答
9

问题是在转换为 之后Object,编译器不知道您正在传递一个数组。尝试将第二个参数转换为(Object[])而不是(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 回答