Как получить значения параметров типа, используя отражение Java? - PullRequest
11 голосов
/ 31 августа 2010
interface Foo<T> { ... }
class Bar implements Foo<Baz> { ... }

У меня есть Bar объект. Как получить для него значение T (Baz)?

Пока мне удалось получить только интерфейс и T, но я не вижу способа получить его значение.

Заранее спасибо.

Ответы [ 2 ]

20 голосов
/ 31 августа 2010
Type type = bar.getClass().getGenericInterfaces()[0];

if (type instanceof ParameterizedType) {
    Type actualType = ((ParameterizedType) type).getActualTypeArguments()[0];
    System.out.println(actualType);
}

Конечно, в общем случае вы должны выполнять итерацию по массиву, а не предполагать, что он содержит один элемент ([0]). В приведенном выше примере вы можете разыграть actualType до java.lang.Class. В других случаях он может быть другим (см. Комментарий от meriton)

0 голосов
/ 22 июня 2015

Если у вас уже есть Guava на пути к классам, это немного более надежно, поскольку вы указываете интерфейс / суперкласс по типу, а не по индексу.

TypeToken<?> baz = TypeToken.of(Bar.class).resolveType(Foo.class.getTypeParameters()[0]);
System.out.println(baz.getRawType()); // class Baz
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...