【问题标题】:Difference between var arg and arrayvar arg 和数组之间的区别
【发布时间】:2014-06-08 14:34:07
【问题描述】:

假设我有一个类似的代码

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 采用相同的数组参数。那为什么他们可以接受的输入不同呢?

like method1 不能接受简单的字符串输入,而 var arg 可以接受可变字符串输入以及数组?

【问题讨论】:

  • @Downvoter 你能提供你反对的理由吗?

标签: java arrays variadic-functions javap


【解决方案1】:

所以根据类文件method1和method2采用相同的数组参数。

是的,除了类文件中有额外的元数据表明method2 的参数是可变参数。这实际上只是参数上的额外数据——仅此而已。

您可以使用Parameter.isVarArgs 通过反射检测它。

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

method2("test")

并将其隐式转换为

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

您并不总是想要这种行为,因此必须使用可变参数语法在参数上明确指定它。

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

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

【讨论】:

  • 是的,我正在使用 Java 7。应该在某个时候尝试一下 8。发送!
  • @Jon Skeet 你真是一位大师,每当我看到他的帖子我都会学到新东西。
【解决方案2】:

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

当您将数组作为参数传递给这两种方法时。要回答您的问题,请不要使用数组

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

如您所见,这仅在您使用 vararg 参数时才有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    相关资源
    最近更新 更多