【发布时间】:2018-07-20 18:08:41
【问题描述】:
我今天意识到这编译并运行良好:
public class Test {
public static <T> T handle(T val) {
System.out.println("T");
return val;
}
public static <T extends String> T handle(T val) {
System.out.println("T extends String");
return val;
}
}
这两个handle 方法具有相同的名称、相同的参数数量和类型(?)。唯一的区别是第二个handle 方法具有更严格的泛型界限。 IDE 完全没有抱怨,代码编译得很好。在运行时按预期选择方法 - 例如Test.handle("this is a string") 将调用第二个方法,Test.handle(10) 将调用第一个方法。
泛型绑定是否被视为方法签名的一部分?还是方法重载解析魔法?
【问题讨论】:
-
简而言之:
<T extends String>被擦除为String,而只有<T>被擦除为Object,因此编译器将创建两个重载方法:handle(Object)和handle(String)以及其他可以根据参数类型选择这些方法的位置。
标签: java generics overload-resolution