获得通用类

时间:2011-03-25 13:34:46

标签: java class generics types parameterized

我的班级以

开头
public abstract class LastActionHero<H extends Hero>(){

现在代码中的某处我想写H.class,但这是不可能的(例如String.classInteger.class)。

你能告诉我如何获得通用的Class吗?

5 个答案:

答案 0 :(得分:15)

我们通过以下方式进行:

    private Class<T> persistentClass;

    public Class<T> getPersistentClass() {
        if (persistentClass == null) {
            this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        }
        return persistentClass;
    }

答案 1 :(得分:7)

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

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.
}

BTW:动态获取它并非不可能,但这取决于它的使用方式。 e.g

public class Arnie extends LastActionHero<MuscleHero> { }

可以确定Arnie.class有一个带有Generic参数MuscleHero的超类。

public class Arnie<H extend Hero> extends LastActionHero<H> { }

在这种情况下,超类的泛型参数只是H

答案 2 :(得分:2)

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

属性
private Class<H> clazz;

创建一个接收Class<H>

的setter或构造函数

参数化类型在运行时被删除,因此您不能按照自己的要求进行操作。

答案 3 :(得分:1)

你可以在不通过课程的情况下完成:

public abstract class LastActionHero<H extends Hero>() {
  Class<H> clazz = (Class<H>) DAOUtil.getTypeArguments(LastActionHero.class, this.getClass()).get(0);
}

您需要此文件中的两个功能:http://code.google.com/p/hibernate-generic-dao/source/browse/trunk/dao/src/main/java/com/googlecode/genericdao/dao/DAOUtil.java

有关详细说明:http://www.artima.com/weblogs/viewpost.jsp?thread=208860

答案 4 :(得分:0)

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