Как получить конкретный тип универсального интерфейса - PullRequest
17 голосов
/ 14 июля 2010

У меня есть интерфейс

public interface FooBar<T> { }

У меня есть класс, который его реализует

public class BarFoo implements FooBar<Person> { }

С отражением я хочу взять экземпляр BarFoo иПолучите, что версия FooBar, которую он реализует, это Person.

Я использую .getInterfaces из BarFoo, чтобы вернуться к FooBar, но это не помогает мне узнать, что такое T.

Ответы [ 2 ]

33 голосов
/ 14 июля 2010

Вы можете получить универсальные интерфейсы класса с помощью 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);
        }
    }
}
5 голосов
/ 14 июля 2010

Попробуйте что-то вроде следующего:

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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...