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



我有这3个类

public class Box<O> {
public O getItem() {...}
}
public class CoolBox extends Box<Integer> { ... }
public class AmazingBox extends CoolBox { ... }

在我的代码中的某一点,我需要获取AmazingBox类的方法getItem()的返回类型,但是当通过反射访问其方法时,我Object为返回类型而不是Integer

有什么方法(普通 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();

我刚刚发现有一个名为 GenericsResolver 的库可以完全满足我的需求。

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

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

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

简而言之,如果您采用混合,type erasures将通过以下规则生效(参考 - oracle文档(

键入擦除

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

  • 如果类型参数是无界的,则用其边界或 Object 替换泛型类型中的所有类型参数。因此,生成的字节码仅包含普通的类、接口和方法。
  • 如有必要,插入类型转换以保持类型安全。
  • 生成桥接方法以保留扩展泛型类型的多态性。

类型擦除可确保不会为参数化类型创建新类;因此,泛型不会产生运行时开销。

最新更新