| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/04/2008 12:58:10
|
nightmare
HelloWorld
Membro desde: 24/02/2008 19:40:55
Mensagens: 24
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
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/04/2008 13:13:22
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17373
Localização: SP
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.
|
Du mußt dein Leben ändern. - R. M. Rilke
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/04/2008 15:34:11
|
sergiotaborda
Forum Spammer
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3008
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
|
Caderno no Java Building
-Quanto custa o seu preço ?
-Taxionomia de uma Entidade
-Crédito Técnico
-Scrum para Tradicionalistas - Previsões
-MVC e Camadas
- Scrum para Tradicionalistas - Tarefas
- Scrum para Tradicionalistas- As pessoas
-Valorizar Práticas ou Praticar Valores ?
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/04/2008 16:19:40
|
nightmare
HelloWorld
Membro desde: 24/02/2008 19:40:55
Mensagens: 24
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/04/2008 16:46:05
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
Membro desde: 07/08/2002 18:38:50
Mensagens: 3637
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://blog.caelum.com.br
Arquitetura e Design de Software: uma visão sobre a plataforma java |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/04/2008 16:26:43
|
nightmare
HelloWorld
Membro desde: 24/02/2008 19:40:55
Mensagens: 24
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/04/2008 16:45:52
|
lusilva1982
Debugger
![[Avatar]](/images/avatar/e2d56b6b53ce40332aec920b78d030c1.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/04/2008 20:25:05
|
nightmare
HelloWorld
Membro desde: 24/02/2008 19:40:55
Mensagens: 24
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/06/2009 23:45:41
|
flaviomg
Smalltalk
Membro desde: 20/06/2009 23:24:57
Mensagens: 1
Offline
|
Valeu pelo código, ajudou mto.
Obrigado.
This message was edited 1 time. Last update was at 23/06/2009 14:10:32
|
|
|
 |
|
|