2017-08-03 88 views
9

我被困于试图传递一个基元数组(在我的情况下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 []的最后一个参数方法的格式(字符串,对象...)并不完全匹配可变参数类型。强制转换为Object []以确认非可变参数调用,或传递可变参数调用的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

注意'String.format'是不是在这里你的方法。它是一个'java.lang.String'的方法。 – 31piy

+0

你是如何构造'String.format'语句的?它是否包含恒定数量的%s参数?如果是这样,它也可以包含恒定数量的参数,而不是数组。 – Eran

+0

如果你知道所需要的int的数量,把它们拼写成:'String.fromat(“%d%d”,ints [0],ints [1])',就像那些'int's将自动复制... –

回答

3

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();

+1

所以基本上你所说的是一个''int''被装箱到一个''Integer''而一个''int []''没有被装箱到一个''Integer []'',所以我有到我自己演员/演员,我是对的吗? – maxxyme

+1

是的,你有想法 – minioim

+0

解决方案是完美的。但是请注意:''方法格式(String,Object ...)的最后一个参数的类型Integer []与vararg参数类型不完全匹配。强制转换为Object []以确认非可变参数调用,或者传递可变参数调用的Object类型的各个参数。''' – maxxyme

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)); 
+0

对不起,但我在Java8中。 – maxxyme