Java 获取泛型类

Java 获取泛型类,java,class,generics,types,parameterized,Java,Class,Generics,Types,Parameterized,我的课从 public abstract class LastActionHero<H extends Hero>(){ 公共抽象类LastActionHero(){ 现在,我想在代码中的某个地方编写H.class,但这是不可能的(比如String.class或Integer.class是) 您能告诉我如何获得泛型的类吗?您不能-该类型在运行时被删除,并且仅在编译时存在。您可以动态提供该类型,但是编译器不会自动为您执行此操作 public abstract class LastA

我的课从

public abstract class LastActionHero<H extends Hero>(){
公共抽象类LastActionHero(){
现在,我想在代码中的某个地方编写
H.class
,但这是不可能的(比如
String.class
Integer.class
是)


您能告诉我如何获得泛型的
类吗?

您不能-该类型在运行时被删除,并且仅在编译时存在。

您可以动态提供该类型,但是编译器不会自动为您执行此操作

public abstract class LastActionHero<H extends Hero>(){
    protected final Class<H> hClass;
    protected LastActionHero(Class<H> hClass) {
        this.hClass = hClass;
    }
    // use hClass how you like.
}
公共抽象类LastActionHero(){
受保护的最终类hClass;
受保护的LastActionHero(类hClass){
this.hClass=hClass;
}
//按你喜欢的方式使用hClass。
}
顺便说一句:动态地获取它并非不可能,但这取决于它的使用方式

public class Arnie extends LastActionHero<MuscleHero> { }
公共类Arnie扩展了LastActionHero{}
可以确定Arnie.class有一个具有泛型参数MuscleHero的超类

public class Arnie<H extend Hero> extends LastActionHero<H> { }
公共类Arnie扩展了LastActionHero{}

在这种情况下,超类的泛型参数将仅为
H

一种方法是保持对参数化类型的引用,就像具有

private Class<H> clazz;
私有类clazz;
并创建一个setter或构造函数,它接受


参数化类型在运行时被擦除,因此您不能按要求执行操作。

我们按以下方式执行:

    private Class<T> persistentClass;

    public Class<T> getPersistentClass() {
        if (persistentClass == null) {
            this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        }
        return persistentClass;
    }
私有类persistentClass;
公共类getPersistentClass(){
if(persistentClass==null){
this.persistentClass=(Class)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
返回persistentClass;
}

您无需通过课程即可完成:

public abstract class LastActionHero<H extends Hero>() {
  Class<H> clazz = (Class<H>) DAOUtil.getTypeArguments(LastActionHero.class, this.getClass()).get(0);
}
公共抽象类LastActionHero(){
类clazz=(类)DAOUtil.getTypeArguments(LastActionHero.Class,this.getClass()).get(0);
}
此文件中需要两个函数:

有关更多说明: