7

我的课开始于

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

现在在我想写的代码中的某个地方,H.class但这是不可能的(就像String.class或是Integer.class)。

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

4

5 回答 5

15

我们通过以下方式进行:

    private Class<T> persistentClass;

    public Class<T> getPersistentClass() {
        if (persistentClass == null) {
            this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        }
        return persistentClass;
    }
于 2011-11-05T09:03:38.400 回答
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.
}

顺便说一句:动态获取它并非不可能,但这取决于它的使用方式。例如

public class Arnie extends LastActionHero<MuscleHero> { }

可以确定 Arnie.class 有一个超类,其 Generic 参数为 MuscleHero。

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

超类的泛型参数就是H在这种情况下。

于 2011-03-25T13:42:57.990 回答
2

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

private Class<H> clazz;

并创建一个接受Class<H>.

参数化类型在运行时被删除,因此你不能按照你的要求去做。

于 2011-03-25T13:44:31.490 回答
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。爪哇

更多解释:http ://www.artima.com/weblogs/viewpost.jsp?thread=208860

于 2013-01-17T21:28:55.017 回答
0

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

于 2011-03-25T13:36:04.440 回答