代码之家  ›  专栏  ›  技术社区  ›  Jacob G.

带泛型参数的主方法;为什么它可以工作?

  •  35
  • Jacob G.  · 技术社区  · 6 年前
    public static <T extends String> void main(T[] args) {
        System.out.println("Hello World!");
    }
    

    我很好奇上面的代码片段是否能够成功地编译和运行,它确实做到了!然而,我也想知道如果 T extends String 被替换为 T extends String & AutoClosable ; String 不实现 AutoClosable ,所以我没想到这会成功运行,但它仍然成功!

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

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

    笔记 :

    • 我用Java100.1测试这个
    • Intellij不能很好地使用这个方法,因为它不将它视为程序的入口点;我没有用其他IDE测试它。
    • 您还可以使用命令行传递参数,就像使用其他程序一样。
    1 回复  |  直到 6 年前
        1
  •  31
  •   Oleksandr Pyrohov Andreas    6 年前

    这是因为类型参数有一个绑定:

    <T extends String>                  =>  String
    
    <T extends String & AutoCloseable>  =>  String & AutoCloseable
    

    擦除后的字节码与常规的相同 main 两种情况下的声明:

    public static main([Ljava/lang/String;)V
    

    JLS §4.4. Type Variables:

    绑定中类型的顺序仅在 擦除 类型变量的类型由其绑定中的第一个类型确定 和 类类型或类型变量只能出现在第一个 位置。