var arg和array之间的区别

时间:2014-06-08 14:34:07

标签: java arrays variadic-functions javap

假设我有一个类似

的代码
public class HelloWorld {

    public static String method1(String[] array){return ""+array.length;}
    public static String method2(String... array){return ""+array.length;}


    public static void main(String args[]) {
        System.out.println(method1(new String[]{"test"})); //allowed
        //System.out.println(method1("test")); Not allowed
        System.out.println(method2(new String[]{"test"}));  //allowed
        System.out.println(method2("test")); //allowed
    }
}

当我做javap HelloWorld

C:\Users\athakur\JavaProjectWorkspace\HelloWorld\bin\test>javap HelloWorld
Compiled from "HelloWorld.java"
public class test.HelloWorld extends java.lang.Object{
    public test.HelloWorld();
    public static java.lang.String method1(java.lang.String[]);
    public static java.lang.String method2(java.lang.String[]);
    public static void main(java.lang.String[]);
}

因此,根据类文件method1和method2采用相同的数组参数。那为什么他们可以采取的输入差异呢?

类似method1不能接受简单的String输入,因为var arg可以接受变量String输入和数组吗?

2 个答案:

答案 0 :(得分:6)

  

因此,根据类文件method1和method2采用相同的数组参数。

是的,除了类文件中有额外的元数据,以指示method2的参数是varargs参数。它实际上只是参数的一个额外数据 - 这就是全部。

您可以使用Parameter.isVarArgs进行反射检测。

这意味着编译器愿意接受这样的调用:

method2("test")

并隐式将其转换为

method2(new String[] { "test" })

总是想要这种行为,因此必须使用varargs语法在参数上明确指定。

我怀疑你还使用了稍微旧版本的javap,如果它没有显示两个方法声明之间的区别。在我的版本(Java 8)上,我得到:

public static java.lang.String method1(java.lang.String[]);
public static java.lang.String method2(java.lang.String...);

答案 1 :(得分:2)

唯一的区别是可能具有可变数量参数的方法的签名,而不是数组参数,您只能传递一个参数。无论如何将数组传递给方法,因为vararg被接受并将在内部使用。另一方面,vararg参数将转换为数组并在那里使用。

将数组作为参数传递给两个方法时都可以。要回答你的问题,不要使用数组

System.out.println(method2("test")); //allowed
System.out.println(method2("test","test2")); //allowed

只有在你注意到使用vararg参数时才有效。