为什么Java不会将int 传递给vararg?

为什么不编译?

public class PrimitiveVarArgs { public static void main(String[] args) { int[] ints = new int[]{1, 2, 3, 4, 5}; prints(ints); } void prints(int... ints) { for(int i : ints) System.out.println(i); } } 

它抱怨第5行,说:

 method prints in class PrimitiveVarArgs cannot be applied to given types; required: int[] found: int[] reason: varargs mismatch; int[] cannot be converted to int 

但就我而言( 以及SO上的其他人 )都知道, int...int[]相同。 如果它是非基本类型(如String ,则不行,但不适用于基元。

我甚至无法添加此方法:

 void prints(int[] ints) { for(int i : ints) System.out.println(i); } 

因为编译器说:

 name clash: prints(int[]) and prints(int...) have the same erasure cannot declare both prints(int[]) and prints(int...) in PrimitiveVarArgs 

那么, 为什么Java不允许你将原生数组传递给varargs方法呢? 另外,如果你愿意,请给我一个解决这个问题的方法(即提供一种方法将变量参数或数组传递给此方法)。

在你的代码中修复它,它会工作:

 static void prints(int... ints) // notice the static keyword at the beginning! 

问题不在于varargs,而在于您从静态上下文调用实例方法的方式。 另外,请确保没有其他具有冲突签名的方法,例如这两个方法看起来与编译器相同:

 void prints(int... ints) void prints(int[] ints)