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

public static <T extends String> void main(T[] args) {
    System.out.println("Hello World!");
}

我很好奇上面的代码片段是否会成功编译和运行,它确实如此!但是,我也想知道如果替换为;会发生什么; 没有实现,所以我没想到它会成功运行,但它仍然可以!T extends StringT extends String & AutoClosableStringAutoClosable

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

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

备注

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

答案 1

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

<T extends String>                  =>  String

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

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

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

JLS §4.4.类型变量:

绑定中类型的顺序之所以重要,是因为类型变量的擦除由其绑定中的第一个类型确定,并且类类型或类型变量可能仅出现在第一个位置。


答案 2

推荐