Подтвердить что ты не робот

Как получить значения параметра типа с использованием java-отражения?

interface Foo<T> { ... }
class Bar implements Foo<Baz> { ... }

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

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

Спасибо заранее.

4b9b3361

Ответ 1

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)

Ответ 2

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

TypeToken<?> baz = TypeToken.of(Bar.class).resolveType(Foo.class.getTypeParameters()[0]);
System.out.println(baz.getRawType()); // class Baz