Java 泛型方法参数的类型

Java 泛型方法参数的类型,java,generics,inheritance,Java,Generics,Inheritance,假设我有一个带有泛型参数的方法: public <U> void genericMethod(U param) { // doStuff } 我这样做: A var = new B(); genericMethod(var); 在genericMethod中,U的类型是什么 我传递的变量genericMethod被声明为A,但实际上是B,类型A或B的U也是如此 我已经尝试过测试它,但我找不到一种方法在运行时获取有关U的信息。泛型类型在编译器时间内解析。因此,由var的编译

假设我有一个带有泛型参数的方法:

public <U> void genericMethod(U param) {
    // doStuff
}
我这样做:

A var = new B();
genericMethod(var);
genericMethod
中,
U
的类型是什么

我传递的变量
genericMethod
被声明为
A
,但实际上是
B
,类型
A
B
U
也是如此


我已经尝试过测试它,但我找不到一种方法在运行时获取有关
U
的信息。

泛型类型在编译器时间内解析。因此,
var
的编译时类型决定,即
A
U
属于
对象
类型,因为您可以将任何内容传递给genericMethod。
它可以是字符串、整数、a或B或其他任何形式。所有对象中最常见的分母是
Object
,因此在genericMethod中,参数的类型将是Object


如果您需要
U
成为A或B,则可以将其定义为

public <U extends A> void genericMethod(U param) {
public void genericMethod(U参数){

但唯一的保证是它是(至少)A,因此您可以访问A的属性和方法,但不能访问B(尽管B可以覆盖A的属性)。

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

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
    }
}

公共类示例{
静态A类{
int x;
}
静态类B扩展了{}
静态U通用方法(U参数){
int i=param.x;//编译时错误
System.out.println(param.getClass());//打印B
返回参数;
}
公共静态void main(字符串…参数){
A var1=新的B();
A var2=一般方法(var1);
B var3=genericMethod(var1);//编译时错误
}
}
从调用
genericMethod
的角度来看,U属于A类型,因此我们可以将返回值分配给A,但不能分配给B

从实现
genericMethod
的角度来看,U的类型是
Object
,因为我们没有给它设置任何边界,所以我们不能引用a的成员字段。如果我们编写
静态U genericMethod(U参数)
,那么U的类型将是a


param
的实际运行时类型是B,如果调用
getClass()

可以看出“类型是什么”的确切含义。
var
是对类型B的对象的引用。“但是我找不到在运行时获取关于U的信息的方法。”",因为在运行时没有关于U的任何信息。泛型纯粹是编译时的东西。现在知道了这一点,您应该知道问题的答案。做得好!回答得好…我认为这个答案可以更好地解释1)引用变量的编译时类型2)引用的运行时类型之间的区别变量3)参数对象的运行时类型。“从实现genericMethod的角度来看,U是object类型”这指的是参数变量的运行时类型,但没有明确说明。在编译时,参数的类型只是
U
inside
genericMethod
。这一点可以清楚地观察到,因为例如,您不能将类型
Object
的值分配给
param
。此外,它不是s我可以在Java中为变量使用名称
var
var
在Java 10及更高版本中有特殊意义!代码仍然合法,但相当混乱!@Lii很好,谢谢,这是我想的,但我不确定。
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
    }
}