Получение типа параметризованного параметра класса? - PullRequest
7 голосов
/ 13 июня 2010

У меня есть следующий класс

public class MyClass<T> {
    public Class<T> getDomainClass() {
          GET THE CLASS OF T
    }
}

Я погуглил эту проблему, и все ответы, которые я смог найти, подсказали мне использовать getGenericSuperClass (), но проблема этого метода в том, что у меня должен быть второй класс, расширяющий MyClass, и я не хочу этого делать , Что мне нужно, это получить параметризованный тип конкретного класса?

Ответы [ 5 ]

5 голосов
/ 13 июня 2010

Вы не можете. Требуемая информация (т. Е. Значение T) недоступна во время выполнения из-за стирания типа.

3 голосов
/ 13 июня 2010

Единственный способ, которым я знаю:

public class MyClass<T> {

    private Class<T> clazz;

    public MyClass(Class<T> clazz) {
       this.clazz = clazz;
    }

    public Class<T> getDomainClass() {
      return clazz;
    }
}

Таким образом, вы в основном предоставляете во время выполнения информацию, которой нет у компилятора.

3 голосов
/ 13 июня 2010

Из-за стирания типа единственный способ получить его - передать его как явный параметр - либо в методе, либо в конструкторе.

public class MyClass<T> {
    public Class<T> getDomainClass(Class<T> theClass) {
          // use theClass
    }
}
1 голос
/ 20 мая 2011

Вы можете сделать это, если хотите получить универсальный тип, который вы наследуете!Добавьте этот метод в свой класс и получайте прибыль!;)

public Class<?> getGenericType() {
    Class result = null;
    Type type = this.getClass().getGenericSuperclass();

    if (type instanceof ParameterizedType) {
        ParameterizedType pt = (ParameterizedType) type;
        Type[] fieldArgTypes = pt.getActualTypeArguments();
        result = (Class) fieldArgTypes[0];
    }

    return result;
}
0 голосов
/ 13 июня 2010

Если вам нужно знать тип, который вы, вероятно, не должны использовать дженерики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...