我试图将一组基元(在我的例子中是int[]
)传递给一个带有varargs的方法。
让我们说:
// prints: 1 2
System.out.println(String.format("%s %s", new String[] { "1", "2"}));
// fails with java.util.MissingFormatArgumentException: Format specifier '%s'
System.out.println(String.format("%s %s", new int[] { 1, 2 }));
但请注意,第一行会收到以下警告:
类型String []的方法格式(String,Object ...)的最后一个参数与vararg参数类型不完全匹配。转换为Object []以确认非varargs调用,或传递类型为Object的各个参数以进行varargs调用。
另请注意,我不使用构造函数输入数组,但是我从封闭方法中获取它,其签名我无法更改,如:
private String myFormat(int[] ints) {
// whatever format it is, it's just an example, assuming the number of ints
// is greater than the number of the format specifiers
return String.format("%s %s %s %s", ints);
}
答案 0 :(得分:6)
String.format(String format, Object... args)
正在等待Object
varargs作为参数。由于int
是基元,而Integer
是java Object
,您确实应该将int[]
转换为Integer[]
。
要做到这一点,你可以使用nedmund答案,如果你使用的是Java 7,或者使用Java 8,你可以使用它:
Integer[] what = Arrays.stream( data ).boxed().toArray( Integer[]::new );
或者,如果您不需要Integer[]
,如果Object[]
足以满足您的需求,您可以使用:
Object[] what = Arrays.stream( data ).boxed().toArray();
答案 1 :(得分:4)
您可以使用包装类Integer
代替,即
System.out.println(String.format("%s %s", new Integer[] { 1, 2 }));
这是您投射现有int[]
数组的方式:
int[] ints = new int[] { 1, 2 };
Integer[] castArray = new Integer[ints.length];
for (int i = 0; i < ints.length; i++) {
castArray[i] = Integer.valueOf(ints[i]);
}
System.out.println(String.format("%s %s", castArray));
答案 2 :(得分:-1)
int varargs转换为对象varargs,创建带有空白分隔符的格式化程序
private void method( int ... values) {
String.format(StringUtils.repeat("%d", " ", values.length), Arrays.stream( values ).boxed().toArray());
}