如何将一组基元作为varargs传递?

时间:2017-08-03 08:07:34

标签: java arrays variadic-functions

我试图将一组基元(在我的例子中是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);
}

3 个答案:

答案 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());
 }