[英]Type of a generic method parameter
假设我有一个带有泛型参数的方法:
public <U> void genericMethod(U param) {
// doStuff
}
我也有两个类,其中一个扩展了另一个:
public class A {}
public class B extends A {}
我这样做:
A var = new B();
genericMethod(var);
在genericMethod
中, U
的类型是什么?
我通过genericMethod
的变量被声明为A
,但实际上是B
,那么U
的类型是A
还是B
?
我已经尝试过测试它,但我找不到在运行时获取U
信息的方法。
让我们稍微修改一下您的示例:
public class Example {
static class A {
int x;
}
static class B extends A {}
static <U> U genericMethod(U param) {
int i = param.x; // compile time error
System.out.println(param.getClass()); // prints B
return param;
}
public static void main(String... args) {
A var1 = new B();
A var2 = genericMethod(var1);
B var3 = genericMethod(var1); // compile time error
}
}
从您调用genericMethod
的角度来看,U 属于 A 类型,因此我们可以将返回值分配给 A,但不能分配给 B。
从genericMethod
的实现来看, U 的类型是Object
,因为我们没有对其进行任何限制,所以我们不能例如引用 A 的成员字段。如果我们写static <U extends A> U genericMethod(U param)
那么 U 的类型就是 A。
param
的实际运行时类型是 B,如您调用getClass()
所见
泛型类型在编译器时解析。 因此, <U>
由var
的编译时类型决定,即A
。
U
的类型为Object
,因为您可以将任何内容传递给 genericMethod。
它可以是字符串、Integer、A 或 B 或其他任何东西。 所有对象中最常见的分母是Object
,因此在 genericMethod 中,参数的类型将为 Object。
如果您需要U
成为 A 或 B,则可以将其定义为
public <U extends A> void genericMethod(U param) {
但是唯一的保证是它(至少)是一个 A,因此您可以访问 A 的属性和方法,但不能访问 B(尽管 B 可以覆盖 A 的属性)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.