Problema generics

9 respostas
andrejusti

Problema generics

Bom dia pessoal, estou tentando fazer uma classe generica porem está dando uma exception, e não uque está errado.

Abaixo segue o codigo;

CLASSE QUE PARA TESTE QUE CHAMA A CLASSE GENERICA E TIPA ELA.

package br.com.dukatitec.a_teste;

import br.com.dukatitec.entidades.post.Post;
import br.com.dukatitec.util.daogenerico.definicoes.OrderByChavePrimaria;
import br.com.dukatitec.util.daogenerico.implementacoes.DaoGenerico;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Teste {

    public static void main(String[] args) {

        try {
            DaoGenerico<Post> daoPost = new DaoGenerico<Post>();
            List<Post> posts = daoPost.selectAll(OrderByChavePrimaria.DEFAULT);
            System.out.println(posts.get(0).getId());
        } catch (Exception ex) {
            ex.printStackTrace();
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}
Classe que possui o Generic
package br.com.dukatitec.util.daogenerico.implementacoes;

import br.com.dukatitec.util.daogenerico.definicoes.ObjOrderAndColumn;
import br.com.dukatitec.util.daogenerico.definicoes.Order;
import br.com.dukatitec.util.daogenerico.definicoes.OrderBy;
import br.com.dukatitec.util.daogenerico.definicoes.OrderByChavePrimaria;
import br.com.dukatitec.util.daogenerico.definicoes.TipoBusca;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class DaoGenerico<T> implements  BaseGenericDao<T>{
   private Class<T> classEntity = null;
    protected static final EntityManagerFactory factory = Persistence.createEntityManagerFactory("entity_and_dao_genericPU");

    public DaoGenerico() {
    }

    private static EntityManagerFactory getFactory() {
        return factory;
    }

    private Class<T> getClassEntity() {
        if (this.classEntity == null) {
            ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();  // EXCEPTION ACONTECE NESTA LINHA...
            this.classEntity = (Class<T>) parameterizedType.getActualTypeArguments()[0];
        }
        return this.classEntity;
    }

    @Override
    public List<T> selectAll(OrderByChavePrimaria orderByChavePrimaria) throws Exception {
        return (List<T>) ImplementsGenericSelectAll.selectAll(getFactory(), (Class<Object>) getClassEntity(), orderByChavePrimaria);
    }
//CONTINUA A CLASSE....

A exception que lança =

java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
        at br.com.dukatitec.util.daogenerico.implementacoes.DaoGenerico.getClassEntity(DaoGenerico.java:30)
        at br.com.dukatitec.util.daogenerico.implementacoes.DaoGenerico.selectAll(DaoGenerico.java:53)
        at br.com.dukatitec.a_teste.Teste.main(Teste.java:16)

9 Respostas

M

Seu problema não é com Generics: é com reflection.

O método getClass().getGenericSuperclass() retorna a superclasse direta da classe atual (ou seja, irá retornar a superclasse de DaoGenerico, que é Object) e não o tipo do argumento genérico.

andrejusti

nesse caso como faria pra resolver, ou seja pra pegar a classe que tipo, exemplo: DaoGenerico

Abraços e obrigado.

Paulo_Silveira

infelizmente nao :frowning:
http://blog.caelum.com.br/2007/04/08/generics-inferencia-de-tipos-e-reificacao-no-java-7/

andrejusti

Seguinte acho que você não me intendeu bem,

eu quero fazer um dao generico…

DaoGenerico<Post> daoPost = new DaoGenerico<Post>();

quero quando eu tipe “” na minha classe =

public class DaoGenerico<T> implements  BaseGenericDao<T>{   
   private Class<T> classEntity = null;   
    protected static final EntityManagerFactory factory = Persistence.createEntityManagerFactory("entity_and_dao_genericPU");   
  
    public DaoGenerico() {   
    }   
  
    private static EntityManagerFactory getFactory() {   
        return factory;   
    }   
  
    private Class<T> getClassEntity() {   
        if (this.classEntity == null) {   
            ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();  // EXCEPTION ACONTECE NESTA LINHA...   
            this.classEntity = (Class<T>) parameterizedType.getActualTypeArguments()[0];   
        }   
        return this.classEntity;   
    }

O atributo classeEntity ganhe o tipo Post que foi oque eu tipei na instancia.
Já vi isso em alguns lugares, vi um exemplo na javamagazine edicao 71 ou 72 se não me engano que fale de hibernate.
Acredito que tenha como fazer mais você não tenha intendido meu problema bem…

Obrigadooo

:smiley:

andrejusti

É como quando faço
List, quer dizer que essa lista é do tipo post
Quero fazer DaoGenerico que esse dao é do tipo Post e o atributo classEntity é do tipo Post assim quando acessar o classEntity para fazer tipo um select generico eu consigo de forma dinamica porque já tipei ela…

Obrigado novamente

M

Você quer descobrir, em tempo de execução, de qual tipo é ‘T’? Se for isso, não é possível, como citado no link que o Paulo Silveira postou:

zoren

Você está tentando instânciar em tempo de execução a sua classe genérica?

ou está tentando trocar o tipo do seu objeto??

confesso que ainda não entendi sua dúvida

zoren

Você quer saber o tipo de Class?

se for é só usar class.forName

fabiozoroastro

andrejusti:
Seguinte acho que você não me intendeu bem,

Obrigadooo
:D

Leia o post que o Paulo postou que você vai ver que ele entendeu sim. =)

Criado 10 de janeiro de 2010
Ultima resposta 11 de jan. de 2010
Respostas 9
Participantes 5