Получить класс универсального - PullRequest
7 голосов
/ 25 марта 2011

Мой класс начинается с

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

Теперь где-то в коде я хочу написать H.class, но это невозможно (например, String.class или Integer.class).

Можете ли вы сказать мне, как я могу получить Class дженерика?

Ответы [ 5 ]

15 голосов
/ 05 ноября 2011

Мы делаем это следующим образом:

    private Class<T> persistentClass;

    public Class<T> getPersistentClass() {
        if (persistentClass == null) {
            this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        }
        return persistentClass;
    }
7 голосов
/ 25 марта 2011

Вы можете указать тип динамически, однако компилятор не сделает этого автоматически.

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.
}

Кстати: это не невозможно получить динамически, но это зависит от того, как это используется. * например 1004 *

public class Arnie extends LastActionHero<MuscleHero> { }

Можно определить, что Arnie.class имеет суперкласс с универсальным параметром MuscleHero.

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

В этом случае универсальный параметр суперкласса будет просто H.

2 голосов
/ 25 марта 2011

Одним из способов является сохранение ссылки на ваш параметризованный тип, например, имеющий атрибут

private Class<H> clazz;

И создайте сеттер или конструктор, который принимает Class<H>.

Параметризованные типы стираются во время выполнения, поэтому вы не можете делать то, что просите.

1 голос
/ 18 января 2013

Вы можете сделать это, не переходя в класс:

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.java

Для более подробного объяснения: http://www.artima.com/weblogs/viewpost.jsp?thread=208860

0 голосов
/ 25 марта 2011

Нельзя - тип стирается во время выполнения и существует только во время компиляции.

...