是否可以使用string [] args和varargs重载主方法?如果不是那么为什么?

0 java overloading

用string [] args和varargs重载主方法是否可能?如果没有那么为什么?我试过下面给出编译错误的代码.请帮助.im新增java.

public class obj1 {

    public static void main(String ... args) {
        System.out.println("main method varargs");
    }

    public static void main(String[] args) {
        System.out.println("main method string arrays");
    }
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

在Java中,这两种方法都是public static void main(String[] args)(基本上).这就是为什么它不会编译; 你不能有一个有两种public static void main(String[])方法的课.

Java通过将函数编译为接受数组来添加可变参数,然后通过调用函数自动将可变参数包装在数组中.

也就是说,如果我们有

void foo(String... args)
Run Code Online (Sandbox Code Playgroud)

打电话给

foo("one", "two", "three");
Run Code Online (Sandbox Code Playgroud)

编译器实际创建的是什么

void foo(String[] args)
Run Code Online (Sandbox Code Playgroud)

打电话给

foo(new String[] { "one", "two", "three"})
Run Code Online (Sandbox Code Playgroud)

(编译器在类文件中标记该方法,以便稍后知道末尾的数组是可变参数,但它创建的代码是接受数组的方法.)

这主要由JLS§8.4.1涵盖:

方法或构造函数的最后一个形式参数是特殊的:它可以是一个变量arity参数,由类型后面的省略号表示.

...

形式参数的声明类型取决于它是否是变量arity参数:

  • 如果形式参数不是变量arity参数,则如果UnannType和VariableDeclaratorId中没有出现括号对,则声明的类型由UnannType表示,否则由§10.2指定.

  • 如果形式参数是变量arity参数,则声明的类型由§10.2指定.(注意,变量arity参数不允许使用"混合符号".)

...其中§10.2正在讨论数组.

实际上,foo(String...)使用数组而不是离散参数调用方法是完全有效的.例如,假设我们有:

private static void foo(String... args) {
    for (String s : args) {
        System.out.println(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

我们可以这样称呼:

foo("one", "two", "three");
Run Code Online (Sandbox Code Playgroud)

或者像这样

foo(new String[] { "four", "five", "six"});
Run Code Online (Sandbox Code Playgroud)

两者都完全有效; 例如:http://ideone.com/a1Ku37