Вопрос-ответ

Get generic type of class at runtime

Получение универсального типа класса во время выполнения

Как я могу этого добиться?

public class GenericClass<T>
{
public Type getMyType()
{
//How do I return the type of T?
}
}

Все, что я пробовал до сих пор, всегда возвращает type Object, а не конкретный используемый тип.

Переведено автоматически
Ответ 1

Как упоминали другие, это возможно только с помощью отражения при определенных обстоятельствах.

Если вам действительно нужен тип, это обычный (типобезопасный) обходной путь:

public class GenericClass<T> {

private final Class<T> type;

public GenericClass(Class<T> type) {
this.type = type;
}

public Class<T> getMyType() {
return this.type;
}
}
Ответ 2

Я видел что-то вроде этого

private Class<T> persistentClass;

public Constructor() {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}

в примере hibernate GenericDataAccessObjects

Ответ 3

Универсальные классы не конкретизируются во время выполнения. Это означает, что информация не присутствует во время выполнения.

Добавление обобщений в Java при сохранении обратной совместимости было сложной задачей (вы можете ознакомиться с основополагающим документом об этом: Обеспечение безопасности прошлого в будущем: добавление универсальности в язык программирования Java).

Существует богатая литература по этому вопросу, и некоторые люди недовольны текущим состоянием, некоторые говорят, что на самом деле это приманка и в этом нет реальной необходимости. Вы можете прочитать обе ссылки, я нашел их довольно интересными.

Ответ 4

Используйте Guava.

import com.google.common.reflect.TypeToken;
import java.lang.reflect.Type;

public abstract class GenericClass<T> {
private final TypeToken<T> typeToken = new TypeToken<T>(getClass()) { };
private final Type type = typeToken.getType(); // or getRawType() to return Class<? super T>

public Type getType() {
return type;
}

public static void main(String[] args) {
GenericClass<String> example = new GenericClass<String>() { };
System.out.println(example.getType()); // => class java.lang.String
}
}

Некоторое время назад я опубликовал несколько полноценных примеров, включая абстрактные классы и подклассы, здесь.

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

java generics reflection