【问题标题】:Why won't Java pass int[] to vararg? [duplicate]为什么 Java 不将 int[] 传递给 vararg? [复制]
【发布时间】:2014-08-20 00:24:25
【问题描述】:

为什么不能编译?

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 方法?另外,如果您愿意,请提供一种方法来解决这个问题(即提供一种方法来传递此方法的变量参数或数组)。

【问题讨论】:

  • Works when I try it,除了prints上缺少static
  • 您可能想阅读以下内容:stackoverflow.com/a/2926653/985949
  • 你用的是什么编译器?
  • 是的,当我创建一个实例并使用它调用prints时也可以工作。
  • 我已使用static 更新了该问题。现在它编译了(不敢相信我没有看到!>.

标签: java arrays variadic-functions primitive-types


【解决方案1】:

在您的代码中修复此问题,它会起作用:

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

问题不在于可变参数,而在于您从静态上下文调用实例方法的方式。另外,请额外确保没有其他签名冲突的方法,例如这两种方法在编译器看来是一样的:

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

【讨论】:

  • 在 OP 代码上产生的错误消息 javac 很奇怪,我正在考虑将其报告为错误,尽管我确信它的优先级较低,因为编译器基本上表现正确(即不编译它)。
  • 奇怪的是,java 6 jdk 给我的错误比 java 8 jdk 更好:Error:(6, 9) java: PrimitiveVarArgs.java:6: non-static method prints(int...) cannot be referenced from a static context
  • 这就是为什么我将问题更改为特定于 IDE 的原因
  • @ÓscarLópez OP 将他们的问题编辑为完全不同。
  • @Supuhstar 这是一条新的错误消息,指的是 Netbeans 预编译器而不是 javac,它有不同的原因(在这个答案和 jdphenix 之间猜测)。您应该提出一个新问题,而不是编辑这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 2016-06-28
相关资源
最近更新 更多