在Java中,这两种方法实际上都是public static void main(String[] args)
(基本上)。这就是为什么它不会编译;你不能有两个public static void main(String[])
方法的类。
Java通过将函数编译为接受数组来添加可变参数,然后通过调用函数自动将可变参数包装到数组中。
也就是说,如果我们有一个名为与
foo("one", "two", "three");
什么编译器实际上是创建
void foo(String... args)
是
void foo(String[] args)
调用
foo(new String[] { "one", "two", "three"})
(编译标记在类文件中的方法,以便它后来知道,在端部阵列是可变参数,但它创建的代码是用于接受阵列的方法。)
这主要是由JLS§8.4.1覆盖:
方法或构造的最后形式参数是特殊的:它可以是一个可变元数参数,通过以下类型的省略号指示。
...
形式参数的声明类型取决于它是否是一个可变参数数量参数:
...其中§10.2在谈论阵列。
事实上,使用数组而不是离散参数调用foo(String...)
方法是完全有效的。例如,假设我们有:
private static void foo(String... args) {
for (String s : args) {
System.out.println(s);
}
}
我们可以调用,要么是这样的:
foo("one", "two", "three");
或类似这样的
foo(new String[] { "four", "five", "six"});
两者都是完全合法的;例如:http://ideone.com/a1Ku37
变量参数('...')实际上只是数组参数的语法糖。因此,您试图使用相同的签名来定义两种方法。 –
也在这里解释:http://stackoverflow.com/questions/301563/difference-fnstring-args-vs-fnstring-args – RichardK
@AndyTurner你应该写这个答案,而不是一个评论:) – sotix