2009-11-03 14 views
6
public Interface Foo<T extends Colors>{...} 

¿Hay alguna forma de recuperar qué T se proporcionó para una implementación de Foo?genéricos de Java - tipo de recuperación

Por ejemplo,

public Class FooImpl implements Foo<Green>{..} 

regresarían verde.

+0

Desde donde estás intentando recuperarlo –

Respuesta

15

Al contrario de otras respuestas, puede obtener el tipo de parámetro genérico. Por ejemplo, la adición de este a un método dentro de una clase genérica obtener el primer parámetro genérico de la clase (T en su caso):

ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass(); 
type.getActualTypeArguments()[0] 

I utilizar esta técnica en un DAO Hibernate genérico escribí para que pueda obtener la clase real persiste porque Hibernate lo necesita. ¡Funciona!

+0

Esto dará el tipo de parámetro declarado, pero parece que eso es lo que se quiere de todos modos. –

+1

+1, siempre es divertido aprender cosas sabidas, incluso cuando tienes que estar equivocado para hacerlo. – JaredPar

+0

Gracias por dar seguimiento a esto. Estaba pensando que la respuesta fue lo que dijo @JaredPar antes de hacer la pregunta, ¡así que supongo que fui demasiado rápido para aceptarla! – tinkertime

9

EDITAR

Resulta que para este caso es posible obtener la información genérica. Singleshot publicó un answer que hace precisamente eso. Su debería ser la respuesta aceptada. Recalificando el mío

En general, hay muchos casos en los que no puede obtener la información de tipo que podría esperar. Java usa una técnica llamada borrado de tipo que elimina los tipos del genérico en el momento de la compilación. Esto le impide obtener información sobre su enlace real en tiempo de ejecución en muchos escenarios.

Niza Preguntas sobre el tema:

+0

Esto está mal Se puede llamar 'Clase .getGenericInterfaces() 'y obtener argumentos de tipo de' ParameterizedType' – ChssPly76

+0

Estoy de acuerdo. Vea mi respuesta, que es el código que realmente uso en un Hibernate DAO genérico que escribí – SingleShot

+0

@SingleShot, @ ChssPly76, me alegra saber que esto es posible. actualicé mi respuesta para esencialmente apuntar a la respuesta de @SingleShot. – JaredPar

0

Una forma de hacerlo es pasar explícitamente un objeto de clase con el tipo. Algo como lo siguiente:

public class FooImpl<T extends Colors> { 
    private Class<T> colorClass; 
    public FooImpl(T colorClass) { 
    this.colorClass = colorClass; 
    } 
    public Class<T> getColorClass() { 
    return colorClass; 
    } 
} 
0

Depende de lo que usted diga exactamente. Sólo T podría ser lo que desee, por ejemplo:

public Interface Foo<T extends Colors>{ public T returnType() {...} ...} 
1

hay. Mira [Javadoc para java.lang.Class # getGenericInterfaces()] (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#getGenericInterfaces())

De esta manera:.?.

public class Test1 { 

    interface GenericOne<T> { 
    } 

    public class Impl implements GenericOne<Long> { 
    } 

    public static void main(String[] argv) { 
     Class c = (Class) ((ParameterizedType) Impl.class.getGenericInterfaces()[0]).getActualTypeArguments()[0]; 
     System.out.println(c); 
    } 
}