retorno - tipo comodin java
Obtener clase de genérico (5)
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;
}
Mi clase comienza con
public abstract class LastActionHero<H extends Hero>(){
Ahora, en alguna parte del código, quiero escribir H.class
pero eso no es posible (como String.class
o Integer.class
is).
¿Puede decirme cómo puedo obtener la Class
del genérico?
No puede: el tipo se borra en tiempo de ejecución y existe solo en tiempo de compilación.
Puede proporcionar el tipo de forma dinámica, sin embargo, el compilador no hace esto por 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.
}
Por cierto: no es imposible obtener esto de forma dinámica, pero depende de cómo se usa. p.ej
public class Arnie extends LastActionHero<MuscleHero> { }
Es posible determinar que Arnie.class tiene una súper 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á solo H
en este caso.
Puedes hacerlo sin pasar en la clase:
public abstract class LastActionHero<H extends Hero>() {
Class<H> clazz = (Class<H>) DAOUtil.getTypeArguments(LastActionHero.class, this.getClass()).get(0);
}
Necesita dos funciones de este archivo: http://code.google.com/p/hibernate-generic-dao/source/browse/trunk/dao/src/main/java/com/googlecode/genericdao/dao/DAOUtil. Java
Para obtener más información: http://www.artima.com/weblogs/viewpost.jsp?thread=208860
Una forma es mantener la referencia a su tipo parametrizado como tener un atributo de
private Class<H> clazz;
Y crea un setter o un constructor que tome una Class<H>
.
Los tipos parametrizados se borran en el tiempo de ejecución, por lo que no puede hacer lo que pide.