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?

Он компилируется в порядке, но когда я выполняю это, String.format() принимает объект vararg как единственный уникальный аргумент (значение toString() самого массива), поэтому он генерирует исключение MissingFormatArgumentException, поскольку оно не может соответствовать второй спецификатор строки (% s).

Как я могу заставить его работать? Спасибо заранее, любая помощь будет принята с благодарностью.

Ответ 1

Используйте это: (я бы рекомендовал этот способ)

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

Но если вы используете этот способ, вы получите следующее предупреждение: Аргумент типа String [] должен быть явно передан объекту [] для вызова формата метода varargs (String, Object...) из типа String. В качестве альтернативы он может быть передан объекту для вызова varargs

Ответ 2

Проблема заключается в том, что после трансляции в Object компилятор не знает, что вы передаете массив. Попробуйте добавить второй аргумент (Object[]) вместо (Object).

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

Или просто не используйте приведение:

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

(см. этот ответ для получения дополнительной информации.)