【发布时间】:2011-07-22 22:26:15
【问题描述】:
我的课开始于
public abstract class LastActionHero<H extends Hero>(){
现在我想在代码中的某处写H.class,但这是不可能的(比如String.class 或Integer.class 是)。
你能告诉我如何获得泛型的Class 吗?
【问题讨论】:
标签: java class generics types parameterized
我的课开始于
public abstract class LastActionHero<H extends Hero>(){
现在我想在代码中的某处写H.class,但这是不可能的(比如String.class 或Integer.class 是)。
你能告诉我如何获得泛型的Class 吗?
【问题讨论】:
标签: java class generics types parameterized
不通过类也可以做到:
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
【讨论】:
我们通过以下方式进行:
private Class<T> persistentClass;
public Class<T> getPersistentClass() {
if (persistentClass == null) {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
return persistentClass;
}
【讨论】:
您可以动态提供类型,但编译器不会自动为您执行此操作。
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。
【讨论】:
一种方法是保持对参数化类型的引用,例如具有属性
private Class<H> clazz;
并创建一个接受Class<H> 的setter 或构造函数。
参数化类型在运行时被删除,因此你不能按照你的要求去做。
【讨论】:
你不能 - 类型在运行时被删除并且只在编译时存在。
【讨论】: