Generics

Olá,

Estou tentanto criar uma classes DAO generica utilizando Generics, só q não estou sabendo como utilizar o .class. O código é o seguinte

[code]package br.com.quadra4.rush.dao.geral;

import br.com.quadra4.rush.dao.util.HibernateUtil;
import java.util.*;
import org.hibernate.Session;
import org.hibernate.Query;
import org.apache.log4j.Logger;

public class BaseDAO<X> {
public BaseDAO() {}

public X buscarPorCodigo&#40;Long codigo&#41; &#123;
    X x = null;

    try &#123;
      Session session = HibernateUtil.getCurrentSession&#40;&#41;;
      HibernateUtil.beginTransaction&#40;&#41;;
      x = &#40;X&#41; session.load&#40;X.class, codigo&#41;;
      HibernateUtil.commitTransaction&#40;&#41;;
    &#125;
    catch &#40;Exception e&#41; &#123;
      HibernateUtil.rollbackTransaction&#40;&#41;;
    &#125;
    finally &#123;
      HibernateUtil.closeSession&#40;&#41;;
    &#125;
    return x;
&#125;

}[/code]

o problema é na linha 18 ( ‘x = (X) session.load(X.class, codigo);’ ). Não consiguo fazer X.class. Como posso fazer isso no Generics.

Anderson

x = &#40;X&#41; session.load&#40;x.getClass&#40;&#41;, codigo&#41;;

mas x é null… Se eu fizer um x.getClass(), vou ter uma Exception

Anderson

Ahh tá, não tinha visto… nesse caso, acho que nao tem como!

Você vai ter que utilizar reflection para saber de qual classe é o Generics do seu DAO.

Acho que o código é esse:

this.getClass&#40;&#41;.getTypeParameters&#40;&#41;&#91;0&#93;.getBounds&#40;&#41;&#91;0&#93;;

Com esse código vc sabe qual é a classe que seu DAO utiliza

vc tem usar o generics assim:

GenericDAO&lt;X&gt;

PessoaDAO extends GenericDAO&lt;Pessoa&gt;


se vc utilizar assim:

GenericDAO&lt;X&gt;

PessoaDAO&lt;X extends Pessoa&gt; extends GenericDAO&lt;X&gt;

o código do reflection vai ser outro.

Reflection com generics é uma coisa meio complexa, mas vai tentando aí que vc consegue[/code]

Cara, primeiro transforma essa classe ai em abstract e
troca o X por T, eh mais ‘padrao’…

Depois faz assim, cria uma propriedade

protected Class persistentClass;

Entao, quem estender essa tua BaseDao, coloca ali a classe de persistencia,
tipo,

class UserDao extends BaseDao&lt;User&gt; &#123;
    public UserDao&#40;&#41; &#123;
         this.persistentClass = User.class;
    &#125;
&#125;