2010-07-14 14 views
15

tengo una interfazCómo obtener el tipo concreto de una interfaz genérica

public interface FooBar<T> { } 

tengo una clase que lo implementa

public class BarFoo implements FooBar<Person> { }

con la reflexión, quiero tomar una instancia de barfoo y entiendo que la versión de FooBar que implementa es Persona.

Uso .getInterfaces de BarFoo para volver a FooBar, pero eso no me ayuda a descubrir qué es T.

Respuesta

24

se puede agarrar interfaces genéricas de una clase por Class#getGenericInterfaces() que luego a su vez bajo control si se trata de un ParameterizedType y luego agarrar el actual type arguments en consecuencia.

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

¡Muchas gracias! Casting to ParameterizedType ayudó – bwawok

+0

De nada. – BalusC

+4

Solo tenga en cuenta que esto no funcionará si definen 'BarFoo' como genérico' BarFoo 'y luego usan' new BarFoo () ', aunque eso sería equivalente desde" su "perspectiva. –

5

intentar algo así como lo siguiente:

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

Cerca, pero no me llegar a la interfaz. BalusC tenía el eslabón perdido. – bwawok

+1

ah se perdió la diferencia. Bueno, use esto si alguna vez necesita GenericSuperClass :) –

Cuestiones relacionadas