为什么NetBeans警告将int []传递给vararg?

时间:2014-08-20 15:47:03

标签: 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);
    }
}

它抱怨第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方法?

1 个答案:

答案 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...)可以做某事"意外"。