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

Is generics bound part of method signature in Java?

我今天意识到这个可以编译并且 运行 没问题:

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) 将调用第一个方法。

泛型绑定是否被视为方法签名的一部分?还是方法重载解析魔法?

仿制药报价 compile-time type-safety;在运行时,您的方法擦除为以下内容:

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;
}

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

考虑泛型的界限。

第一种情况,bound是Object;在第二种情况下,边界是 String.

擦除类型时,使用绑定代替类型变量,因此它们变成了简单的重载,分别获取(并返回)Object 和 String 参数。

没有错。