我想用一系列变量格式化输出字符串。当我使用字符串数组时,这可以按预期工作:
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]
等,但这看起来并不优雅。
为什么会这样,我怎样才能达到预期的效果?
答案 0 :(得分:5)
printf
是variable 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
不是Object
而int[]
是,因此它将整个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);