Вы не можете определить универсальные типы во время выполнения из-за стирания типа . Чтобы сохранить эту информацию после стирания, Member<T>
потребуется взять объект Class<T>
в своем конструкторе и удерживать его:
public class Member<T> {
public final Class<T> type;
private T id;
private T complexityLevel;
//constructor
public Member(T id, T complexityLevel, Class<T> type) {
id = id;
this.complexityLevel = complexityLevel;
this.type = type;
}
Потом позже:
Member<String> mString = new Member<String>("id1", "High", String.class);
...
System.out.println(mString.type.getName());
В качестве альтернативы, если гарантировано, что id
никогда не будет null
, вы можете использовать отражение, чтобы получить объект Class
, представляющий его тип:
System.out.println(mString.getId().getClass().getName());
Конечно, getClass () вернет Class<? extends T>
. Так что если id
на самом деле является подклассом T
, вы получите имя этого класса, а не имя T
.