私のクラスは
public abstract class LastActionHero<H extends Hero>(){
今、コードのどこかに書きたいのですH.class
が、それは不可能です (likeString.class
またはInteger.class
is)。
Class
ジェネリックを入手する方法を教えてください。
私のクラスは
public abstract class LastActionHero<H extends Hero>(){
今、コードのどこかに書きたいのですH.class
が、それは不可能です (likeString.class
またはInteger.class
is)。
Class
ジェネリックを入手する方法を教えてください。
次の方法で行います。
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 には、MuscleHero のジェネリック パラメータを持つスーパー クラスがあると判断できます。
public class Arnie<H extend Hero> extends LastActionHero<H> { }
スーパークラスのジェネリックパラメータはまさにH
この場合になります。
1 つの方法は、次の属性を持つように、パラメーター化された型への参照を維持することです。
private Class<H> clazz;
を受け取るセッターまたはコンストラクターを作成しますClass<H>
。
パラメータ化された型は実行時に消去されるため、要求したことを実行できないのはなぜですか。
あなたはクラスを通過せずにそれを行うことができます:
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をご覧ください。
できません-型は実行時に消去され、コンパイル時にのみ存在します。