我的班级以
开头public abstract class LastActionHero<H extends Hero>(){
现在代码中的某处我想写H.class
,但这是不可能的(例如String.class
或Integer.class
)。
你能告诉我如何获得通用的Class
吗?
答案 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>
。
参数化类型在运行时被删除,因此您不能按照自己的要求进行操作。
答案 3 :(得分:1)
你可以在不通过课程的情况下完成:
public abstract class LastActionHero<H extends Hero>() {
Class<H> clazz = (Class<H>) DAOUtil.getTypeArguments(LastActionHero.class, this.getClass()).get(0);
}
有关详细说明:http://www.artima.com/weblogs/viewpost.jsp?thread=208860
答案 4 :(得分:0)
您不能 - 该类型在运行时被擦除,并且仅在编译时存在。