[RESOLVIDO] Duvida sobre Generics

Boa tarde Pessoal,

Supondo que eu tivesse a classe de dominio: br.com.guj.Usuario

E na classe TesteClass eu irei printar o Class desse dominio.

public class TesteClass{

    public void printClass() {
        System.out.println(Usuario.class);
    }
    
}

Utilizando a classe:

public class Teste {
        
    public static void main(String... args) {
        
        new TesteClass().printClass();
        
    }
}

A saída seria: class br.com.guj.Usuario

Agora eu gostaria de deixar a classe TesteClass de forma genérica:

public class TesteClassGeneric<T>{

    public void printClass() {
        
        // A linha abaixo não irá compilar, é apenas para que vocês vejam o meu intuito.
        System.out.println( T.class );

    }
    
}

Utilizando a classe:

public class Teste {
        
    public static void main(String... args) {
        
        new TesteClassGeneric<Usuario>().printClass();
        
    }
}

Gostaria que ao utilizar a classe de forma generica, lá na TesteClassGeneric ele conseguisse ver o Tipo que passei, e pudesse chegar ao .class dela.

Teria como Fazer isso?

Oi!

Não entendi muito a sua dúvida, mas algo assim talvez lhe ajude:

[code]public class TesteClass{

public void printClass(Class<?> clazz) {   
    System.out.println(clazz);   
}   

}

public class TesteClassGeneric {

public void printClass() {              
    System.out.println(Usuario.class);     
}   

} [/code]

Seria isso ou queres pegar a classe de outra forma?

Conforme o exemplo que mencionei…

Se eu instanciar a classe TesteClassGeneric, passando NO tipo generico a classe Usuario,

eu gostaria de imprimir o Usuario.class, no casso o tipo T.class … da umaolhada com calma no exemplo que passei que você vai entender. :wink:

Guilherme,

Acho que sei o que você quer. Dê uma olhada neste post no blog da caelum:

http://blog.caelum.com.br/brincando-com-generics-o-bizarregenericdao/

Fala g4j,

li a matéria a respeito… .e é exatamente isto que preciso.

Vou realizar os testes quando chegar em casa… e dou o feedback.

Muitissimo Obrigado.

[quote=guivirtuoso]Fala g4j,

li a matéria a respeito… .e é exatamente isto que preciso.

Vou realizar os testes quando chegar em casa… e dou o feedback.

Muitissimo Obrigado.[/quote]

Eu acho que da forma que você quer não dá pra fazer.

Esse exemplo da caelum é para uso de herança.

Você teria que estender a classe que contém o método printClass() para poder usar o recurso.

Tipo assim:

public class TesteClassGeneric<T> {  

    private final Class<T> tClass;

    public TesteClassGeneric() {
        this.tClass =
                (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    } 
  
    public void printClass() {              
        System.out.println(tClass);     
    }   
}

public class Teste extends TesteClassGeneric<Usuario>{
        
    public static void main(String... args) {
        
        new TesteClassGeneric().printClass();
        
    }
}

O romarcio tem razão. Necessita invokar getGenericSuperclass().

Não testei, mas acho que vem null sem herança.

Rapaziada,

Realizei os testes com a sugestão do Romarcio, e de fato funcionaram muito bem.

Queria agradecer a todos pela ajuda!

Levantei essa questão para usar numa classe DAO que fosse Base para todas as outras DAOs do sistema.

E nessa classe basica no caso… BaseDAO … tem os metodos comuns tipo save, update e delete, e não estava conseguindo definir um metodo base para um “listarTodos()” usando session.createCriteria( Dominio.class ).list()

Sendo assim como minha DominioDAO extends BaseDAO<Dominio> agora posso deixar inclusive caras como um listTodos() na classe BaseDAO e especializar as consultas quando necessário.

Vlw pessoal.