2011-03-25 12 views
7

Mi clase empieza conclase genérica de

public abstract class LastActionHero<H extends Hero>(){ 

Ahora en alguna parte del código que quiero escribir H.class pero eso no es posible (como String.class o Integer.class es).

¿Puede decirme cómo puedo obtener el Class del genérico?

Respuesta

7

Puede proporcionar el tipo de forma dinámica, sin embargo, el compilador no hace esto para usted automágicamente.

public abstract class LastActionHero<H extends Hero>(){ 
    protected final Class<H> hClass; 
    protected LastActionHero(Class<H> hClass) { 
     this.hClass = hClass; 
    } 
    // use hClass how you like. 
} 

BTW: No es imposible obtener esto de forma dinámica, pero depende de cómo se use. por ejemplo

public class Arnie extends LastActionHero<MuscleHero> { } 

Es posible determinar que Arnie.class tiene una super clase con un parámetro Genérico de MuscleHero.

public class Arnie<H extend Hero> extends LastActionHero<H> { } 

El parámetro genérico de la superclase será sólo H en este caso.

0

No se puede: el tipo se borra en el tiempo de ejecución y existe solo en tiempo de compilación.

2

Una forma es mantener referencia a su tipo parametrizado como tener un atributo de

private Class<H> clazz; 

y crear una incubadora o un constructor que toma en un Class<H>.

Los tipos parametrizados se borran en el tiempo de ejecución, por lo que no puede hacer lo que pide.

15

Lo hacemos de la siguiente manera:

private Class<T> persistentClass; 

    public Class<T> getPersistentClass() { 
     if (persistentClass == null) { 
      this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
     } 
     return persistentClass; 
    } 
Cuestiones relacionadas