var arg和array的区别



假设我有一个类似

的代码
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:UsersathakurJavaProjectWorkspaceHelloWorldbintest>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不能接受简单的字符串输入,其中var arg可以接受变量字符串输入以及数组?

所以根据类文件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...);

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

当你将一个数组作为参数传递给两个方法时都有效。为了回答你的问题让我们不要使用数组

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

这只在使用变量参数时有效,正如您注意到的。

相关内容

  • 没有找到相关文章

最新更新