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!");
}
所以我的问题是,为什么它仍然可以成功运行?
注释:
答案 0 :(得分:31)
这是因为类型参数有界:
<T extends String> => String
<T extends String & AutoCloseable> => String & AutoCloseable
在两种情况下,擦除后的字节码与常规main
声明相同:
public static main([Ljava/lang/String;)V
绑定中类型的顺序仅在擦除中有效 类型变量的类型取决于其边界中的第一个类型,并且 类类型或类型变量只能出现在第一个 位置。