7

私のクラスは

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

今、コードのどこかに書きたいのですH.classが、それは不可能です (likeString.classまたはInteger.classis)。

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 には、MuscleHero のジェネリック パラメータを持つスーパー クラスがあると判断できます。

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

スーパークラスのジェネリックパラメータはまさにHこの場合になります。

于 2011-03-25T13:42:57.990 に答える
2

1 つの方法は、次の属性を持つように、パラメーター化された型への参照を維持することです。

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の2つの関数が必要です。 java

詳細については、http ://www.artima.com/weblogs/viewpost.jsp?thread=208860をご覧ください。

于 2013-01-17T21:28:55.017 に答える
0

できません-型は実行時に消去され、コンパイル時にのみ存在します。

于 2011-03-25T13:36:04.440 に答える