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
insidegenericMethod
。这一点可以清楚地观察到,因为例如,您不能将类型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
}
}