泛型方法参数的类型

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在运行时获取信息的方法。

tgd*_*ies 5

让我们稍微修改一下您的示例:

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()