Sup*_*tar 6 java arrays variadic-functions primitive-types netbeans-8
为什么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);
}
}
Run Code Online (Sandbox Code Playgroud)
它抱怨第5行,说:
Confusing primitive array passed to vararg method
Run Code Online (Sandbox Code Playgroud)
但就我而言(和SO上的其他人所知),就像我int...一样int[].如果它是非基本类型,则可以工作String,但不是基元.
我甚至无法添加此方法:
void prints(int[] ints)
{
for(int i : ints)
System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)
因为编译器说:
name clash: prints(int[]) and prints(int...) have the same erasure
cannot declare both prints(int[]) and prints(int...) in PrimitiveVarArgs
Run Code Online (Sandbox Code Playgroud)
在查看NetBeans提示设置时,我发现它说:
传递给variable-argument方法的基本数组将不会被解包,并且其项目将不会被视为被调用方法中的可变长度参数的项目.相反,该数组将作为单个项目传递.
但是,当我运行该文件时(因为它只是一个警告而不是错误),我得到了我期望的输出:
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
那么,为什么像我这样的NetBeans不会将本机数组传递给varargs方法呢?
这是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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
[I@15db9742 // on my machine
Run Code Online (Sandbox Code Playgroud)
与此代码对比:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
请注意我的例子中的签名prints().它接受Object...,而不是int....NetBeans试图警告你可能会发生"奇怪"(意外)的事情,但错误地报告prints(int...)可能会做出"意外"的事情.