Java 以编程方式获取泛型声明的值?

Java 以编程方式获取泛型声明的值?,java,generics,reflection,Java,Generics,Reflection,我声明一个类如下: public class SomeClass extends AdditionalClass<GenericClass> { ... } …产生“附加类”。什么方法调用允许我查询该对象并获得“GenericClass”结果?您必须获取超类的参数化类型的数组。例如: SomeClass object = new SomeClass(); Type parameterizedClassType = ((ParameterizedType) o

我声明一个类如下:

public class SomeClass extends AdditionalClass<GenericClass> {
  ...
}

…产生“附加类”。什么方法调用允许我查询该对象并获得“GenericClass”结果?

您必须获取超类的
参数化类型的数组。例如:

SomeClass object = new SomeClass();
Type parameterizedClassType = 
         ((ParameterizedType) object.getClass().getGenericSuperclass())
         .getActualTypeArguments()[0];
System.out.println(parameterizedClassType.getTypeName());
这应该打印
com.whateverpackage.GenericClass

请注意,即使在编译
SomeClass
时发生类型擦除,也会保留有关超类的类型参数信息,因为它们是类定义的一部分


但是,如果
SomeClass
是泛型的(即类似于
SomeClass扩展了AdditionalClass
),那么对于所有
SomeClass
实例,类型参数(即
)将被替换为实际的类型,哪些不会成为
.getActualTypeParameters()
数组的一部分。

与您的问题无关,但您为什么要检查泛型类型?我正在以编程方式从应用程序中提取声明,以便在整洁的电子表格中将它们提供给非技术用户。好的。我只是想确保你没有为一项更简单的任务走上错误的道路。也就是说,为什么非技术用户会关心泛型类型?这就提出了更多的问题。“非技术用户”如何处理这些显然非常技术性的信息?秘密酱汁,我的朋友们。秘密酱汁。当
GenericClass
本身是泛型类型时,这是否有效?i、 e.我在上面;)但是,如果将
参数化类类型
强制转换为
,则它不起作用。但只要您使用
类型
,一切都应该正常。
SomeClass object = new SomeClass();
Type parameterizedClassType = 
         ((ParameterizedType) object.getClass().getGenericSuperclass())
         .getActualTypeArguments()[0];
System.out.println(parameterizedClassType.getTypeName());