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 参数。
没有错。
我今天意识到这个可以编译并且 运行 没问题:
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 参数。
没有错。