泛型是否绑定了Java中方法签名的一部分?

Xin*_*hao 11 java generics overload-resolution

我今天意识到这个编译并运行良好:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这两个handle方法具有相同的名称,并且?参数的数量和类型()相同.唯一的区别是第二种handle方法具有更严格的通用界限.IDE根本没有抱怨,代码编译得很好.在运行时方法按预期选择 - 例如,Test.handle("this is a string")将调用第二个方法Test.handle(10)并将调用第一个方法.

泛型绑定是否被认为是方法签名的一部分?或者它是一种方法重载决议魔术?

Jac*_* G. 12

泛型提供编译时类型安全性; 在运行时,您的方法将擦除以下内容:

public static Object handle(Object val) {
    System.out.println("T");
    return val;
}

public static String handle(String val) {
    System.out.println("T extends String");
    return val;
}
Run Code Online (Sandbox Code Playgroud)

由于方法重载,handle(String)将在传递时调用String,并handle(Object)在传递任何其他时将被调用Object(请记住String是最终的并且可以没有子节点).