为什么NetBeans预编译器会对此发出警告?
public class PrimitiveVarArgs
{
public static void main(String[] args)
{
int[] ints = new int[]{1, 2, 3, 4, 5};
prints(ints);
}
static void prints(int... ints)
{
for(int i : ints)
System.out.println(i);
}
}
它抱怨第5行,说:
Confusing primitive array passed to vararg method
但就我(and others on 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
在查看NetBeans提示设置后,我发现它说:
传递给变量参数方法的基本数组将不会被解包,并且其项目不会被视为被调用方法中的可变长度参数的项目。相反,该数组将作为单个项目传递。
然而,当我运行文件时(因为它只是一个警告而不是错误),我得到了我期望的输出:
1
2
3
4
5
所以,为什么像我这样的NetBeans将原生数组传递给varargs方法?
答案 0 :(得分:6)
这是NetBeans中的一个错误。
https://netbeans.org/bugzilla/show_bug.cgi?id=242627
请考虑以下代码:
public class Test {
public static void main(String[] args) {
int[] ints = new int[]{1, 2, 3, 4, 5};
prints(ints);
}
static void prints(Object... ints) {
for(Object i : ints) {
System.out.println(i);
}
}
}
输出:
[I@15db9742 // on my machine
与此代码对比:
public class Test {
public static void main(String[] args) {
Integer[] ints = new Integer[]{1, 2, 3, 4, 5};
prints(ints);
}
static void prints(Object... ints) {
for(Object i : ints) {
System.out.println(i);
}
}
}
输出:
1
2
3
4
5
在我的示例中注意prints()
的签名。它接受Object...
,而不是int...
。 NetBeans正在试图警告你,有些事情是“奇怪的”#34; (意外)可能会发生,但错误地报告prints(int...)
可以做某事"意外"。