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

2022-09-03 14:56:34

我被困在尝试将一个基元数组(在我的情况下是)传递给一个带有varargs的方法。int[]

比方说:

    // 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 调用,或为 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);
}

答案 1

正在等待一个 varargs 作为参数。由于 是 一个原语, 而 是一个 java ,你确实应该把你的转换为 .String.format(String format, Object... args)ObjectintIntegerObjectint[]Integer[]

要做到这一点,如果你在Java 7上,你可以使用nedmund answer,或者,使用Java 8,你可以用一行:

Integer[] what = Arrays.stream( data ).boxed().toArray( Integer[]::new );

或者,如果您不需要 ,如果 一个足以满足您的需求,则可以使用:Integer[]Object[]

Object[] what = Arrays.stream( data ).boxed().toArray();


答案 2

您可以改用包装类,即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));