假设我有一个类似
的代码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输入和数组吗?
答案 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参数时才有效。