var arg和array的区别

3
假设我有这样一段代码:
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[]);
}

根据类文件,方法1和方法2都使用相同的数组参数。那么为什么它们可以接受不同的输入呢?

例如,方法1无法接受简单的字符串输入,而可变参数可以接受可变的字符串输入以及数组。


@Downvoter,您能否提供下降投票的原因? - Aniket Thakur
2个回答

7

因此,根据类文件,方法1和方法2都使用相同的数组参数。

是的,除了类文件中有额外的元数据指示method2的参数是可变参数。实际上,这只是参数上的额外数据 - 就是这样。

您可以使用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...);

是的,我正在使用Java 7。有时间应该试试Java 8。谢谢! - Aniket Thakur
@Jon Skeet,您真是一位大师,每当我看到他的帖子时,我都能学到新的东西。 - Anirudh

2
唯一的区别在于方法签名可能具有可变数量的参数,而不是只能传递一个数组参数。无论如何,将数组作为变量参数传递给方法是被接受的并将在内部使用。另一方面,可变参数将被转换为数组并在那里使用。当您将数组作为参数传递给两种方法时都有效。为了回答您的问题,让我们不使用数组。
System.out.println(method2("test")); //allowed
System.out.println(method2("test","test2")); //allowed

只有在使用可变参数时,这个方法才有效,正如你所发现的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接