Jac*_* G. 35 java generics program-entry-point type-inference
public static <T extends String> void main(T[] args) {
System.out.println("Hello World!");
}
Run Code Online (Sandbox Code Playgroud)
我很想知道上面的代码片段是否可以编译并成功运行,而且确实如此!但是,我也想知道如果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!");
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,为什么这仍然成功运行?
备注:
Ole*_*hov 31
这是因为类型参数有一个绑定:
<T extends String> => String
<T extends String & AutoCloseable> => String & AutoCloseable
Run Code Online (Sandbox Code Playgroud)
擦除后的字节码与main两种情况下的常规声明相同:
public static main([Ljava/lang/String;)V
Run Code Online (Sandbox Code Playgroud)
绑定中类型的顺序仅在于,类型变量的擦除由其边界中的第一个类型确定,并且类类型或类型变量可能仅出现在第一个位置.