Generics

6 respostas
gustavodelgado

Olá,
Estou começando a fazer umas implementações com generics, e em um determinado momento preciso pegar o tipo da classe que foi passada. Certa vez vi isto em um exemplo… mas não consegui fazer funcionar. O tipo em questão retorna nulo.
Fiz 3 pequenas classes resumindo o que eu queria. Se alguém tiver alguma idéia de como fazer, agradeço.

package testes;

public class Generics<g> {
    public Class<g> klass;
    
    public void mostra(){
        System.out.println(klass.getClass());
    }
}

Este atributo Class klass deve conter a classe que foi passada por generics, certo?

package testes;

import br.com.progov.intranetlibrary.entidade.SetorNivel;

public class Generics2 extends Generics<SetorNivel> {

}
  • SetorNivel é uma classe do meu sistema
package testes;

import br.com.progov.intranetlibrary.entidade.SetorNivel;

public class Generics3 {

    public static void main(String[] args) {
        Generics2 g2 = new Generics2();
        g2.mostra();       
    }
    
}
  • Esta classe é só para ver o resultado de klass.getClass(). Está imprimindo null. Como faço para pegar o tipo???

Obrigado.

6 Respostas

Mauricio_Linhares

Está imprimindo null ou está dando NullPointerException?

Esse código aí não deveria estar imprimindo nada.

gustavodelgado

Desculpe… é NullPointerException mesmo, rs
Quando eu coloco System.out.println(klass); é que imprime null.
[]s

gustavodelgado

this.getClass() retorna “Generics2”. Eu queria algo que retornasse SetorNivel por exemplo…

Mauricio_Linhares

Não dá pra fazer isso do jeito que você está querendo, porque as informações dos tipos genéricos não existem em tempo de execução. Pra fazer isso você tem que passar uma referência para o seu tipo de classe em algum lugar.

gustavodelgado

Não dá pra fazer isso do jeito que você está querendo, porque as informações dos tipos genéricos não existem em tempo de execução. Pra fazer isso você tem que passar uma referência para o seu tipo de classe em algum lugar.

Na verdade eu vi um exemplo de um DAO genérico de um colega meu que era o seguinte:

public class GenericoDAOHibernateImpl<GDAOHI> extends HibernateDaoSupport implements GenericoDAO<GDAOHI> {
    private Log logger = LogFactory.getLog(this.getClass());
    private Class<GDAOHI> obj;
    
    public boolean insert(GDAOHI objeto) {
        try {
            getHibernateTemplate().save(objeto);
            return true;
        } catch(DataAccessException dae) {
            logger.error("Erro ao gravar os dados!");
            return false;
        }
    }
    
    public boolean delete(GDAOHI objeto) {
        try {
            getHibernateTemplate().delete(objeto);
            return true;
        } catch(DataAccessException dae) {
            logger.error("Erro ao gravar os dados!");
            return false;
        }
    }

    public List<GDAOHI> list() {
        return getHibernateTemplate().executeFind(new HibernateCallback() {
            public Object doInHibernate(Session session) throws HibernateException {
                Criteria criteria = session.createCriteria(obj);
                return criteria.list();
            }
        });
    }

    public GDAOHI load(long id) {
        return (GDAOHI)this.getHibernateTemplate().load(obj, id);
    }
    
}

Repare no atributo “obj”, e como ele o utiliza no método “list”. Não seria o mesmo caso? Como isso pôde funcionar com ele? rs
Valeu.

B

o erro esta aqui?

voce nao inicializou o atributo klass em lugar nenhum desse codigo
tenta imprimir o seguinte

Criado 20 de novembro de 2006
Ultima resposta 20 de nov. de 2006
Respostas 6
Participantes 3