具有通用参数的主要方法;为什么行得通?

时间:2018-07-15 20:13:14

标签: java generics main type-inference

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!");
}

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

注释

  • 我正在使用Java 10.0.1对此进行测试
  • Intellij不适用于此方法,因为它没有将其视为程序的入口点。我尚未在其他IDE上进行过测试。
  • 您还可以像使用其他任何程序一样使用命令行传递参数。

1 个答案:

答案 0 :(得分:31)

这是因为类型参数有界:

<T extends String>                  =>  String

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

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

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

JLS §4.4. Type Variables:

  

绑定中类型的顺序仅在擦除中有效   类型变量的类型取决于其边界中的第一个类型,并且   类类型或类型变量只能出现在第一个   位置。