【问题标题】:why no the collisions on the main function overloading? [duplicate]为什么没有主函数重载的冲突? [复制]
【发布时间】:2013-01-07 21:25:03
【问题描述】:

可能重复:
Can we overload the main method in Java?

当我尝试编译并运行以下代码时,它正在工作,我在控制台上看到“A”。

为什么?

在我看来 (String... args) 是一样的 (String arg, String[] args)

public class AFewMainExample {
    public static void main(String... args) {
        System.out.print("A");
    }

    public static void main(String args) {
        System.out.print("B");
    }

    public static void main(String[] args, String arg) {
        System.out.print("C");
    }

    public static void main(String arg, String[] args) {
        System.out.print("D");
    }
}

【问题讨论】:

  • (String... args)(String[] args) 相同。
  • @MrSmith42 大体相同,除非你打电话给他们 ;)
  • @Peter Lawrey:差别只是一点语法糖。
  • @MrSmith42 如果你调用main("a", "b");,它将与String...一起工作,但不能与String[]一起编译。
  • @Peter Lawrey:是的,因为包装数组是为您创建的,如果您使用String... 语法。

标签: java main variadic-functions


【解决方案1】:

这实际上是在JLS中指定的,§12.1.4

方法main 必须声明为publicstaticvoid。它必须指定一个声明类型为String 的数组的形式参数(§8.4.1)。因此,可以接受以下任一声明:

  • public static void main(String[] args)

  • public static void main(String... args)

varargs 类型和标准数组类型之间除了调用函数的方式之外没有区别,如 here 所述。因此,可变参数版本满足上面详述的所有标准,并作为有效的main 方法传递。显然,所有其他 main 重载都不等效(否则会出现编译错误)。

【讨论】:

  • 不幸的是public static void main(String argc[])
【解决方案2】:

第一个签名是唯一匹配 void main (String[] args)

difference fn(String... args) vs fn(String[] args)

【讨论】:

    【解决方案3】:

    每个主要方法的参数(顺序(或)类型(或)两者)都不同,因此只有一个主要方法具有真正的主要语法,因此没有问题。

    如果您添加以下 main 方法,您将看到编译时错误,因为现在有两个方法具有精确的语法。

    public static void main(String[] args) {
        System.out.print("A");
    }
    

    阅读本教程以获取有关 overloading 的更多信息。

    【讨论】:

      【解决方案4】:

      主要问题是:

      + signature of main(String... args) is different for
          - main(String[] args, String arg)
          - main(String arg, String[] args)
      
      + main(String... args) 
          - not equals for main(String[] args, String[] args2)
          - only for main(String[] args)
      

      虽然我在以下示例中发现了编译错误:

      public class MainOverloadingExample4 {
      
      void go(String s){
          System.out.println("void go(String s)");
      }
      void go(String ... s){
          System.out.println("void go(String ... s)");
      }   
      void go(String s, String ... arr){
          System.out.println("void go(String s, String ... arr){");
      }   
      public static void main(String[] args) {
          new MainOverloadingExample4().go("where I am?", "why I am here?");
      }
      }
      

      方法 go(String[]) 对于 MainOverloadingExample 类型不明确

      【讨论】:

        猜你喜欢
        • 2019-01-09
        • 1970-01-01
        • 1970-01-01
        • 2022-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        相关资源
        最近更新 更多