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

max*_*yme 14 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 }));
Run Code Online (Sandbox Code Playgroud)

但请注意,第一行会收到以下警告:

类型String []的方法格式(String,Object ...)的最后一个参数与vararg参数类型不完全匹配.转换为Object []以确认非varargs调用,或者为varargs调用传递Object类型的各个参数.

另请注意,我不使用构造函数输入数组,但是我从封闭方法中获取它,其签名我无法更改,例如:

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);
}
Run Code Online (Sandbox Code Playgroud)

min*_*oim 8

String.format(String format, Object... args)等待一个Object可变参数作为参数.既然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();

  • 因此,基本上,您要说的是将“ int”装在“ Integer”中,而将“ int []”装在“ Integer []”中,因此我必须我自己进行演员/转换,对吗? (3认同)