6

为什么 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

但据我(和 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 方法呢?

4

1 回答 1

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 试图警告您可能会发生“奇怪”(意外)的事情,但会错误地报告可能会发生prints(int...)“意外”的事情。

于 2014-08-20T21:26:08.517 回答