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

时间:2014-08-20 00:24:25

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

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

但就我(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

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

1 个答案:

答案 0 :(得分:10)

将此问题修复到您的代码中并且它可以正常工作:

static void prints(int... ints) // notice the static keyword at the beginning!

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

void prints(int... ints)
void prints(int[]  ints)