Java 带泛型参数的主方法;它为什么有效?

Java 带泛型参数的主方法;它为什么有效?,java,generics,main,type-inference,Java,Generics,Main,Type Inference,所以我的问题是,为什么它仍然成功运行 注释: 我正在用Java10.0.1测试这一点 Intellij不能很好地使用此方法,因为它不将其视为程序的入口点;我还没有用其他IDE测试过它 您还可以使用命令行传递参数,就像在其他程序中一样 这是因为类型参数有一个界限: public static <T extends String & AutoCloseable> void main(T[] args) { System.out.println("This still w

所以我的问题是,为什么它仍然成功运行

注释

  • 我正在用Java10.0.1测试这一点
  • Intellij不能很好地使用此方法,因为它不将其视为程序的入口点;我还没有用其他IDE测试过它
  • 您还可以使用命令行传递参数,就像在其他程序中一样

    • 这是因为类型参数有一个界限:

      public static <T extends String & AutoCloseable> void main(T[] args) {
          System.out.println("This still works!");
      }
      

      边界中类型的顺序仅在擦除时才有意义 类型变量的类型由其边界中的第一个类型确定,并且 类类型或类型变量只能出现在第一个 位置


      @Li357只有第一个绑定对擦除类型有贡献和必需的
      抛出异常
      声明,程序仍然在编译时没有任何警告,并且在运行时失败,因为
      字符串
      无法强制转换为
      自动关闭
      @wchargin:很好!但是我认为编译器没有发出任何警告并不奇怪,因为定义一个不打算作为入口点的
      main
      方法是合法的。(根据我的经验,没有编译器会发出类似于
      publicstaticvoidmain()
      的警告)
      main
      的调用方式与反射方式类似,有效地避免了静态类型系统在运行时未具体化的任何方面。@wchargin您不会显式调用
      main
      方法;如果您试图从代码中执行此操作(传递的参数未实现
      自动关闭
      接口),则会出现
      不兼容边界
      编译器错误。您的答案尽管正确,但需要更多解释。
      public static <T extends String & AutoCloseable> void main(T[] args) {
          System.out.println("This still works!");
      }
      
      <T extends String>                  =>  String
      
      <T extends String & AutoCloseable>  =>  String & AutoCloseable
      
      public static main([Ljava/lang/String;)V