为什么printf不能使用一组int进行格式化?

时间:2011-03-04 09:53:12

标签: java

我想用一系列变量格式化输出字符串。当我使用字符串数组时,这可以按预期工作:

String[] myArray = new String[3];
// fill array with strings
System.out.printf("1: %s \n2: %s \n3: %s\n", myArray);

我想用它来打印模拟骰子投掷的结果,所以我使用了一个int数组。但是,这不起作用:

int[] myArray = new int[3];
// fill array with numbers
System.out.printf("1: %d \n2: %d \n3: %d\n", myArray);
Exception in thread "main" java.util.IllegalFormatConversionException: d != [I

当然,我可以为每个元素使用myArray[0]等,但这看起来并不优雅。

为什么会这样,我怎样才能达到预期的效果?

4 个答案:

答案 0 :(得分:5)

printfvariable argument method,它采用String(格式字符串)和任意数量的参数(要格式化)。

Varargs在Java中实现为数组。 printf期望Object作为其varargs类型,因此内部类型为Object[]

String[]是-a Object[](即可以转换为该类型),因此String[]的元素将被解释为单独的参数。

然而,int[]无法转换为Object[],因此int[]本身将成为varargs数组的第一个(也是唯一的)元素。

然后,您尝试使用int[]格式化%d,这不起作用,因为int[]不是(单个)十进制数。

答案 1 :(得分:3)

这是因为String是引用类型(即Object的子类),而int是基本类型。 printf方法需要一个Object s数组(实际上是可变长度参数列表),因此String[]适合。每当您传递int[]时,由于int不是Objectint[]是,因此它将整个int[]作为单个对象并认为是单一论点。

答案 2 :(得分:2)

我不确定但是String是一个对象而int不是。
printf获取参数的Object数组 请改为Integer[] myArray

答案 3 :(得分:0)

printf使用变量参数,以便我们可以向它传递0 t0 n个参数:

public PrintString printf(String format, Object... args);

out.printf("%s:%s", a, b);

这相当于:

out.printf("%s:%s", new Object[] { a, b });

所以,回到你的问题,对于一个数组,你可以写:

out.printf("%s:%s", things);