假设我有一个类似
的代码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
这只在使用变量参数时有效,正如您注意到的。