繁体   English   中英

泛型方法参数的类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM