| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/07/2005 20:46:10
|
Sergio Lopes
Moderador
![[Avatar]](/images/avatar/8232e119d8f59aa83050a741631803a6.jpg)
Membro desde: 17/11/2003 00:22:10
Mensagens: 1368
Localização: São Paulo - SP
Offline
|
Pessoal, uma dúvida de generics:
Tenho um método assim:
Porque, dentro dele, eu nao posso fazer isso
sem fazer o cast para Class<Action> ??
This message was edited 1 time. Last update was at 16/07/2005 20:46:28
|
Sérgio Lopes - twitter: @sergio_caelum - blog pessoal: sergiolopes.org
Curso Java | Apostilas Java | Arquitetura Java | Curso Rails |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/07/2005 09:04:03
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
Porque Java é feio! Eu também reparei isso. Acho que é um motivo puramente técnico e não arquitetutal, orientação-a-objetal, filosofal etc. Acho que quem entende de bytecode pode explicar melhor, e eu não sou um deles
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/07/2005 10:05:39
|
Filipe Sabella
GUJ Expert
Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline
|
O upperbound wildcard define que o parâmetro deve ser um subclasse da classe definida.
1. "? extends Type": Denotes a family of subtypes of type Type. This is the most useful wildcard
2. "? super Type": Denotes a family of supertypes of type Type
3. "?": Denotes the set of all types or any
Mais aqui:
http://java.sun.com/developer/technicalArticles/J2SE/generics
Mas, me diga, por que você precisa fazer esse cast dentro do método?
|
Former LIPE. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/07/2005 10:22:27
|
Sergio Lopes
Moderador
![[Avatar]](/images/avatar/8232e119d8f59aa83050a741631803a6.jpg)
Membro desde: 17/11/2003 00:22:10
Mensagens: 1368
Localização: São Paulo - SP
Offline
|
No método real, eu pego esse atributo Action e coloco ele num List<Class<Action>>. Eu não consigo colocar o atributo action daquele metodo sem fazer o casting.
O que eu nao entendo é: se meu metodo recebe Class de qualquer coisa que extende Action, porque não posso usar esse objeto como Class<Action>?
Fazendo o casting, tenho segurança de que *sempre* estará correto?? Não existe a menor chance de dar ClassCastException, certo?
O eclipse dá warning nesse casting... não quero ficar jogando @SuppressWarnings("unchecked") pelo meu código...
|
Sérgio Lopes - twitter: @sergio_caelum - blog pessoal: sergiolopes.org
Curso Java | Apostilas Java | Arquitetura Java | Curso Rails |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/07/2005 10:41:48
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
Que eu saiba não existe covariancia por tipo genérico.
Ou seja Class<Integer> não é um tipo de Class<Object>.
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/07/2005 10:46:07
|
Sergio Lopes
Moderador
![[Avatar]](/images/avatar/8232e119d8f59aa83050a741631803a6.jpg)
Membro desde: 17/11/2003 00:22:10
Mensagens: 1368
Localização: São Paulo - SP
Offline
|
Certo... nao automaticamente
Mas estou certo em dizer que se fizer um casting de Class<Integer> para Class<Object> isso *sempre* vai estar correto?? Ou existe alguma possibilidade de dar ClassCastException?
|
Sérgio Lopes - twitter: @sergio_caelum - blog pessoal: sergiolopes.org
Curso Java | Apostilas Java | Arquitetura Java | Curso Rails |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/07/2005 10:53:06
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
Sérgio, um cast entre parâmetros de um mesmo tipo genérico não deveria dar class cast exception jamais.
Não testei, mas o seguinte código não deveria larçar exceptions:
Class<JButton> a = JButton.class;
Class<URL> u = (Class<URL> a;
Lembre que temos erasure, e no final das contas vai ser tudo Class mesmo.
This message was edited 1 time. Last update was at 18/07/2005 10:53:51
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/07/2005 10:57:45
|
Sergio Lopes
Moderador
![[Avatar]](/images/avatar/8232e119d8f59aa83050a741631803a6.jpg)
Membro desde: 17/11/2003 00:22:10
Mensagens: 1368
Localização: São Paulo - SP
Offline
|
eu tenho aquela lista de List<Class<Action>>
quando eu fizer: Action a = list.get(0).newInstance();
isso nao pode dar ClassCastException?
|
Sérgio Lopes - twitter: @sergio_caelum - blog pessoal: sergiolopes.org
Curso Java | Apostilas Java | Arquitetura Java | Curso Rails |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/07/2005 13:28:47
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Só brincando um pouco. Este código compila OK mesmo com -Xlint:unchecked.
This message was edited 2 times. Last update was at 18/07/2005 13:30:45
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/07/2005 14:00:09
|
Sergio Lopes
Moderador
![[Avatar]](/images/avatar/8232e119d8f59aa83050a741631803a6.jpg)
Membro desde: 17/11/2003 00:22:10
Mensagens: 1368
Localização: São Paulo - SP
Offline
|
nossa, legal isso
acho q agora entendi o negocio
vc nao trata como Class<Action>, mas sempre como Class<? extends Action>... realmente isso faz mais sentido.
e vc nao precisa fazer cast em lugar nenhum.
eu me confundo mto com generics... o fato de ser em tempo de compilacao e nao de execucao as vezes confunde um pouco as possibilidades
valeu pessoal!
|
Sérgio Lopes - twitter: @sergio_caelum - blog pessoal: sergiolopes.org
Curso Java | Apostilas Java | Arquitetura Java | Curso Rails |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/07/2005 14:46:57
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
É pena que não baixei ainda o compilador do C# 2.0. Daria para comparar as implementações de generics entre o C# e o Java.
Se não me engano, essa coisa esquisita de "? extends Action" seria em C#:
onde "IList" é a interface java.util.List, e "Type" é a java.lang.Class.
Em C# dá chabu misturar a classe System.Generics.ArrayList < T > e a classe System.ArrayList; não são água e óleo, mas não é recomendado misturar as duas .
Em Java são a mesma classe ( java.lang.ArrayList <E> ).
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/07/2005 23:45:19
|
Gerson
JavaChild
![[Avatar]](/images/avatar/ccb1d45fb76f7c5a0bf619f979c6cf36.jpg)
Membro desde: 26/01/2003 19:48:37
Mensagens: 113
Localização: São Paulo
Offline
|
"Class<? extends Action> action"
isso quer dizer que vc pode atribuir à variavel action uma instancia de Class desde ela corresponda a uma subclasse de Action, incluindo a propria Action.
"Class<Action> action2"
isso quer dizer que vc pode atribuir à variavel action2 uma instancia de Class desde que ela corresponda a classe Action.
Agora imagina se vc passasse um Class<SubClasseDeAction> no parametro do metodo (usando um Class.forName(...))! Não seria mais verdade que action2 "aponta" para uma instancia de Class que corresponde a uma Action ( Class<Action> ), certo?! E cuidado, pois se vc forçar o cast, provavelmente o seu compilador irá lançar um warning dizendo que vc tá jogando o generics pro espaço!! Isso quer dizer q não ha mais nenhuma garantia em tempo de compilacao (unsafe), sendo ela por sua conta apenas!
Espero ter ajudado!
This message was edited 1 time. Last update was at 18/07/2005 23:46:21
|
---
Gerson K. Motoyama
(SCJA, SCJP, SCWCD, SCBCD, SCEA-I) |
|
|
 |
|
|