2010-07-14 3 views
15

меня есть интерфейсКак получить конкретный тип общего интерфейса

public interface FooBar<T> { } 

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

public class BarFoo implements FooBar<Person> { }

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

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

ответ

24

Вы можете получить общие интерфейсы класса по Class#getGenericInterfaces() который затем в свою очередь проверки, если это ParameterizedType, а затем захватить actual type arguments соответственно.

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); 
     } 
    } 
} 
+0

Огромное спасибо! Литье в ParameterizedType помогло – bwawok

+0

Добро пожаловать. – BalusC

+4

Просто имейте в виду, что это не сработает, если они определяют «BarFoo» как общий «BarFoo », а затем используют «новый BarFoo ()», хотя это было бы эквивалентно с точки зрения «их». –

5

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

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]; 
} 
+1

GenericSuperClass! = GenericInterface – BalusC

+0

близко, но не пойми меня к интерфейсу. У BalusC было недостающее звено. – bwawok

+1

ах пропустил разницу. Ну, используйте это, если вам когда-нибудь понадобится GenericSuperClass :) –