Как получить конкретный тип общего интерфейса
У меня есть интерфейс
public interface FooBar<T> { }
У меня есть класс, который его реализует
public class BarFoo implements FooBar<Person> { }
С отражением я хочу взять экземпляр BarFoo и получить, что версия FooBar, которую он реализует, - Person.
Я использую .getInterfaces
из BarFoo, чтобы вернуться к FooBar, но это не помогает мне узнать, что такое T.
Ответы
Ответ 1
Вы можете захватить общие интерфейсы класса Class#getGenericInterfaces()
, который затем, в свою очередь, проверяет, является ли это ParameterizedType
, а затем возьмите аргументы фактического типа соответственно.
Type[] genericInterfaces = BarFoo.class.getGenericInterfaces();
for (Type genericInterface : genericInterfaces) {
if (genericInterface instanceof ParameterizedType) {
Type[] genericTypes = ((ParameterizedType) genericInterface).getActualTypeArguments();
for (Type genericType : genericTypes) {
System.out.println("Generic type: " + genericType);
}
}
}
Ответ 2
Попробуйте следующее:
Class<T> thisClass = null;
Type type = getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
Type[] typeArguments = parameterizedType.getActualTypeArguments();
thisClass = (Class<T>) typeArguments[0];
}