Referenciando Genéricos dinamicamente

7 respostas
nicholas.bittencourt

Pessoal,

Estou criando uma classe ObjectHelper para realizar as operações basicas em cima de um objeto, como compare, hash e toString, usando genéricos e annotations. Meu problema acontece quando tenho que descobrir dinamicamente a Classe que o Helper se refere quando ele é criado dinamicamente… Deixa eu explicar.

Se eu extendo o ObjectHelper pra uma classe especifica da forma abaixo

public class PessoaHelper extends ObjectHelper<Pessoa> {

eu consigo pegar a classe pessoa usando o codigo

clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

O problema dessa implementação é que só funciona com herança e por isso eu teria que criar uma classe para cada entidade do meu sistema. A minha ideia é criar os Helpers dinamicamente como fazemos com as Collections…

ObjectHelper<Pessoa> pessoaHelper = new ObjectHelper<T>();

Nesse caso acima, como eu não estou extendendo nenhuma classe, nao consigo descrobrir a classe que meu Generico esta referenciado. Alguem tem alguma sugestão?

7 Respostas

kaoe

Se estou correto pelo que li de genéricos não tem como mais você pode colocar no construtor do seu helper um parametro com o Class que ele é feito.

algo como:

ObjectHelper<Pessoa> pessoaHelper = new ObjectHelper<Pessoa>(Pessoa.class);
nicholas.bittencourt

Mas ai você concorda que estou criando uma redundância de parêmetros, né? Já crio a classe como Genérico pro usuario não ter esse tipo de problema e ele ainda precisa passar um parâmetro repetido… :confused:

O pior é que talvez essa seja a unica solução.

T

Se você tiver a paciência de ler o FAQ de Genéricos da Angelika Langer ( http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html ), deve encontrar uma resposta a suas perguntas.

nicholas.bittencourt

Realmente não existe uma solução explicita no Javadoc ou nos manuais da Sun…

F

Já tentei fazer isso tb e não encontrei solução, na época encontrei um bug no site da sun. Da uma pesquisada lá.

Flw

sergiotaborda

nicholas.bittencourt:
Pessoal,

Estou criando uma classe ObjectHelper para realizar as operações basicas em cima de um objeto, como compare, hash e toString, usando genéricos e annotations. Meu problema acontece quando tenho que descobrir dinamicamente a Classe que o Helper se refere quando ele é criado dinamicamente… Deixa eu explicar.

Tudo bem que vc crie essas funções para devertimento, mas numa aplicação real, elas não devem ser definidas fora do objeto.

O problema com a sua abordagem é que a sua classe não precisa ser genérica em primeiro lugar, mas se for,será apenas para facilitar a escrita e a tipagem… assim

class  ObjectHelper<T> {


   public int hashCode(T obj){

       // define um hashCode para obj baseado nos hash dos atributos usando reflection

        Class<T> classe = obj.getClass(); // aqui tem a classe

        classe.getFields() ... // o resto do codigo
        
 
       
  }

}

Uso

Cliente a = new Cliente();
 ObjectHelp<Cliente> helper = ObjectHelp<Cliente> ();
 return helper.hashCode(a);

O objetivo de usar reflection é não precisar saber qual é a classe especifica,e portanto generics é desnecessário neste caso.

Como disse antes, e repito, hashCode() , toString() e compare() não devem ser implementados de forma genérica como vc está tentando, e sim dentro dos objetos correspondentes… mas ai fica como fazer, se vc quiser muito fazer isso… :slight_smile:

mister_m

[quote=nicholas.bittencourt]

ObjectHelper&lt;Pessoa&gt; pessoaHelper = new ObjectHelper&lt;T&gt;();

Creio eu que isso:

ObjectHelper&lt;Pessoa&gt; pessoaHelper = new ObjectHelper&lt;T&gt;() {};

deve funcionar, mas é um baita code smell.

Criado 28 de junho de 2007
Ultima resposta 29 de jun. de 2007
Respostas 7
Participantes 6