elc*_*cye 3 java generics inheritance
假设我有一个带有泛型参数的方法:
public <U> void genericMethod(U param) {
// doStuff
}
Run Code Online (Sandbox Code Playgroud)
我也有两个类,其中一个扩展了另一个类:
public class A {}
public class B extends A {}
Run Code Online (Sandbox Code Playgroud)
我这样做:
A var = new B();
genericMethod(var);
Run Code Online (Sandbox Code Playgroud)
在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
}
}
Run Code Online (Sandbox Code Playgroud)
从您调用 的角度来看genericMethod,U 属于 A 类型,因此我们可以将返回值分配给 A,但不能分配给 B。
从 的实现来看genericMethod, U 是 type Object,因为我们没有对它进行任何限制,所以我们不能,例如,引用 A 的成员字段。如果我们写了static <U extends A> U genericMethod(U param)那么类型你会是A。
的实际运行时类型param是B,你可以看到如果你调用getClass()
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |