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