Java 如何在超类中获得泛型类?

Java 如何在超类中获得泛型类?,java,reflect,Java,Reflect,如何在超类构造函数中获得泛型类型的类 换句话说,我想要一个类实例,其中T是我的超类中的泛型。 这在下面的代码中适用于ChildA类,其中我直接在类本身中定义泛型类,但当子类是泛型类时(如GenericChildB示例中所示),我也需要它 /** *空课 */ 私有静态类Foo{} /** *从泛型类扩展而来的非泛型类 */ 私有静态类ChildA扩展了GenericClass{} /** *从泛型类扩展而来的泛型类 */ 私有静态类ClassChildB扩展了GenericClass{} 私有抽

如何在超类构造函数中获得泛型类型的类

换句话说,我想要一个
实例,其中T是我的超类中的泛型。 这在下面的代码中适用于
ChildA
类,其中我直接在类本身中定义泛型类,但当子类是泛型类时(如
GenericChildB
示例中所示),我也需要它

/**
*空课
*/
私有静态类Foo{}
/**
*从泛型类扩展而来的非泛型类
*/
私有静态类ChildA扩展了GenericClass{}
/**
*从泛型类扩展而来的泛型类
*/
私有静态类ClassChildB扩展了GenericClass{}
私有抽象静态类GenericClass{
@抑制警告(“未选中”)
公共泛型类(){
类型Type=getClass().getGenericSuperclass();
/**
*从ChildA构建时:
*type=generics.Main$GenericClass
*与其他世界的通用类型
* 
*但当从GenericChildB构建时:
*泛型类型仅为:
*type=generics.Main$GenericClass
*当试图将其转换为参数化类型时,它会抛出一个错误
*因为这不是一个实际的类。
* 
*/
系统输出打印项次(类型);
类classInstance=(类)((ParameteredType)类型).getActualTypeArguments()[0];
//目标是在GenericClass的构造函数中获取类对象
系统输出打印LN(classInstance);
}
}
公共静态void main(字符串[]args){
//作品:
GenericClass genericClassA=新儿童A();
//不起作用:
GenericClass genericClassB=新的GenericChildB();
}

这是因为Java中的类型擦除

在第一种情况下,将非泛型类
ChildA
GenericClass
的具体实现绑定,即编译时
GenericClass
。因此Java能够使用这些信息

在第二种情况下,
GenericChildB
Foo
之间的绑定只在运行时发生。Java无法使用此信息

通过以下方式扩展您的示例:

私有静态类ClassChildC扩展了ClassChildB{}
因为这个类是非泛型的,所以绑定发生在编译时。您将能够再次获取类型信息

这在您的实际场景中可能是可以接受的,也可能是不可以接受的,但这几乎是使用Java类型擦除保留类型信息的唯一方法