Extrair nome do tipo Generico  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
nightmare
Thread.start()

Membro desde: 24/02/2008 19:40:55
Mensagens: 25
Offline

Boa tarde, pessoal,

Estou com um problema que acredito que vocês já devem ter passado. Preciso de um método que descubro o tipo do passado por generics em tempo de execução. Para tal, 99% das respostas encontradas na interface, recaem sobre a mesma linha de código.

Dado uma classe A<B>, para obter o tipo "B", devemos fazer?



PS: se tiver erro de digitação ignorem pois eu escrevi o código não copiei e colei pois o original é bem maior

Bom, o código já dá erro na primeira linha. java.lang.ClassCastException: java.lang.Class . Claro, o método "getGenericSuperclass()" retorna um objeto do tipo class e estou fazer um cast para ParameterizedType que está dando pau.
Mas todo lugar que vou, passam essa solução e simplesmente não funciona aqui. Já passei para uns três amigos aqui no trabalho e ninguem descobre. Alguém aqui, tem idéia do que acontece? Estou pensando em abortar a idéia de usar Generics nos meus projetos pois estou com receio de mais erros estranhos.

Antes que alguém sugira, tambem já fiz esse teste: Criar uma subclasse e partir chamar a generica. Ficou algo assim:

public class TesteDAO()
{

public TesteDAO(){
new A<Bean>();
//Bean sendo um bean válido qualquer

}

}


O resultado desejado é que objectClass, seja um object Class do tipo Bean e com isso eu possa fazer um ".getSimpleName" e ele me retorne a String "Bean".

Espero ter conseguido expressar meu problema e que alguém possa me ajudar. USo JDK 5.0 aqui no trabalho. Mas se o problema for versão em casa tenho o 6.0 (mas não fiz todos os testes que já fiz aqui).

Agradeço qualquer ajuda.

This message was edited 1 time. Last update was at 13/04/2008 17:14:40

thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17572
Offline

O problema de Generics em Java é o conceito de "erasure".
Basicamente, a menos que você guarde em um objeto da classe A<B> uma referência para a classe B (ou seja, B.class), você não tem como saber B.
Não deixe de usar Generics nos seus projetos; é só saber como você deve proceder.
Vou dar um exemplo daqui a pouco.


[WWW]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 4080
Offline

Vc pode fazer assim



Note que em momento algum vc precisa saber quem é B.

This message was edited 2 times. Last update was at 11/04/2008 15:35:00


JavaBuilding : construções em java



Blog do MiddleHeaven
Lista de Discussão do MiddleHeaven
[WWW]
nightmare
Thread.start()

Membro desde: 24/02/2008 19:40:55
Mensagens: 25
Offline

Eu preciso recuperar o nome do tipo passado ao genérico como String. Pode ser que exista até forma mais "elegante" de se fazer, mas gostaria de saber se isso for possível.

Em um último caso, farei com que a string vire um parametro dos métodos, vai funcionar, mas não queria que fosse assim. Ainda mais por ter visto tantas pessoas na internet que dizem ter conseguido obter essa informação via reflection.

Alguém mais tem idéia?

This message was edited 1 time. Last update was at 11/04/2008 16:20:41

Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4401
Localização: São Paulo
Offline

infelizmente, nao da pra fazer isso!! voce vai precisar pegar a classe via parametro Class, ou String.

Aqui tem dois posts que podem te ajudar a entender a questao. Esse vala da tentativa que voce ta fazendo, que funciona caso a sua classe seja estendida:
http://blog.caelum.com.br/2006/10/29/brincando-com-generics-o-bizarregenericdao/

E esse fala sobre a reificacao, que é o que voce gostaria que o java tivesse pra te ajudar:
http://blog.caelum.com.br/2007/04/08/generics-inferencia-de-tipos-e-reificacao-no-java-7/

Aqui tem uma quantidade grande de pessoas, que como eu e voce, gostaria de que tivesse reificacao no java:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5098163

http://www.caelum.com.br
Casa do Código - Livros para o Programador
[Email] [WWW]
nightmare
Thread.start()

Membro desde: 24/02/2008 19:40:55
Mensagens: 25
Offline

Muito obrigado pelo esclarecimento. Descobri que havia alguns erros no meu código mas usando o primeiro link passado já solucionou o meu problema. Eu adicionei a minha interface DAO um método para recuperar a classe do objeto e na implementação generica usei o código que haviam passado que utilizado o "ParameterizedType" e funcionou como eu queria.

Mais uma vez, obrigado
lusilva1982
Debugger
[Avatar]

Membro desde: 16/07/2006 19:41:30
Mensagens: 63
Localização: São Paulo
Offline

nightmare , você pode postar o código que funcionou, por favor?
Eu ainda não entendi como foi possível...


Obrigado.

"A humildade vem antes da honra."
http://www.lucianosilva.com
[WWW] [MSN]
nightmare
Thread.start()

Membro desde: 24/02/2008 19:40:55
Mensagens: 25
Offline

Vamos lá:

Primeiro um Bean qualquer (Us.java):


Depois uma interface (Int.java):


Depois vamos implementá-la (Impl.java):



Vamos testar, classe Main (Main.java):



Basicamente foi isso que fiz e funcionou como eu queria. Ele retornou a String Us que o nome de minha classe generica passada como parametro. Não me atentei a detalhes de padrão, e preferi ao invés de copiar meu código fazer outro bem simples para ficar visível o que fiz. Espero ter ajudado.
flaviomg
Smalltalk

Membro desde: 20/06/2009 23:24:57
Mensagens: 2
Offline

Valeu pelo código, ajudou mto.
Obrigado.

This message was edited 1 time. Last update was at 23/06/2009 14:10:32

Michel.Montenegro
JavaTeenager
[Avatar]

Membro desde: 18/05/2006 13:11:14
Mensagens: 173
Localização: Brasil - Pará - Belém
Offline

Interessante, no caso criaste uma classe anonima que já herda BaseDAO assi utilizando a mesma.

Gostei da solução.

Michel Montenegro
- Curriculo Lattes
- Projeto Parallax
- E-mail/Msn/GoogleTalk: michel.montenegro@gmail.com

"Transforme a Fraqueza em Força!"
[MSN]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team