Java 获取继承的泛型方法的返回类型

Java 获取继承的泛型方法的返回类型,java,generics,inheritance,Java,Generics,Inheritance,我有这三门课 public class Box<O> { public O getItem() {...} } 在代码中的某一点上,我需要为AmazingBox类获取方法getItem()的返回类型,但是当通过反射访问其方法时,我将对象作为返回类型,而不是整数 有没有办法(普通java或额外的库)将Integer作为返回类型 这是我用来获取返回类型的代码: Class<?> c = AmazingBox.class; // This is not how

我有这三门课

public class Box<O> {

    public O getItem() {...}

}
在代码中的某一点上,我需要为
AmazingBox
类获取方法
getItem()
的返回类型,但是当通过反射访问其方法时,我将
对象
作为返回类型,而不是
整数

有没有办法(普通java或额外的库)将
Integer
作为返回类型

这是我用来获取返回类型的代码:

Class<?> c = AmazingBox.class;  // This is not how i get the class but its for demonstration purposes

Method m = c.getMethod("getItem");

Type t = m.getReturnType();
Class c=AmazingBox.Class;//这不是我获得课程的方式,而是出于演示目的
方法m=c.getMethod(“getItem”);
类型t=m.getReturnType();

我刚刚发现有一个名为的库,它完全满足我的需要

使用这段代码返回正确的类型

Class<?> clazz = AmazingBox.class;
GenericsContext genericsContext = GenericsResolver.resolve(clazz);
Method method = clazz.getMethod("getItem");
Type methodReturnType = genericsContext.method(method).resolveReturnType();
Class clazz=AmazingBox.Class;
GenericsContext GenericsContext=GenericsResolver.resolve(clazz);
方法方法=clazz.getMethod(“getItem”);
类型methodReturnType=GenericContext.method(method).resolveReturnType();

继承时,可以使用泛型来继承类,并相应地创建下限或上限。如果不这样做,则假定您在工作时没有使用泛型,并且在继承非泛型类时不会获得类型安全性

简言之,如果您采用混合模式,
类型擦除将根据以下规则生效(参考-oracle文档)

类型擦除 Java语言中引入了泛型,以在编译时提供更严格的类型检查,并支持泛型编程。为了实现泛型,Java编译器将类型擦除应用于:

  • 如果类型参数是无界的,则用其边界或对象替换泛型类型中的所有类型参数。因此,生成的字节码只包含普通类、接口和方法
  • 如有必要,插入类型强制转换以保持类型安全
  • 生成桥接方法以在扩展泛型类型中保留多态性
类型擦除确保没有为参数化类型创建新类;因此,泛型不会产生运行时开销


你能展示一下你用来获取
O
的代码吗?对不起,我弄错了,我得到的是
Object
类。我添加了代码。问题是,我不知道如何获取
整数
我认为您无法获取
整数
,因为泛型只是编译时的事情。如果
AmazingBox
CoolBox
覆盖了该方法,则可以得到
Integer
。因为实际返回的类型是
Object
,所以可以得到
Object
,这种机制被称为类型擦除,这意味着在验证了类型的正确性之后,编译器会发出一个类型消失的代码。泛型只是编译时构造。请尝试
getGenericReturnType()
Class<?> c = AmazingBox.class;  // This is not how i get the class but its for demonstration purposes

Method m = c.getMethod("getItem");

Type t = m.getReturnType();
Class<?> clazz = AmazingBox.class;
GenericsContext genericsContext = GenericsResolver.resolve(clazz);
Method method = clazz.getMethod("getItem");
Type methodReturnType = genericsContext.method(method).resolveReturnType();