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

Sup*_*tar 3 java arrays variadic-functions primitive-types

为什么不编译?

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

它抱怨第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
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)

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

Ósc*_*pez 10

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

static void prints(int... ints) // notice the static keyword at the beginning!
Run Code Online (Sandbox Code Playgroud)

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

void prints(int... ints)
void prints(int[]  ints)
Run Code Online (Sandbox Code Playgroud)

  • 在OP的代码上生成的错误消息`javac`很奇怪,我正在考虑将其报告为错误,尽管我确定它的优先级较低,因为编译器本质上表现正常(即不编译它). (6认同)
  • @Supuhstar这是一个新的错误消息,指的是Netbeans预编译器而不是javac,它有不同的原因(猜测这个答案和jdphenix之间).你应该问一个新问题而不是编辑这个问题. (5认同)
  • 奇怪的是java 6 jdk给我一个比java 8 jdk更好的错误:`错误:(6,9)java:PrimitiveVarArgs.java:6:非静态方法print(int ...)不能从静态上下文引用` (2认同)
  • @ÓscarLópezOP编辑他们的问题完全不同. (2认同)