| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/04/2009 12:13:06
|
Lavieri
GUJ Master
![[Avatar]](/images/avatar/7b41bfa5085806dfa24b8c9de0ce567f.png)
Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline
|
Que o compilador some com o T, eu sei... so que da mesma forma que ele subistitui os T por Cidade e cria os métodos correspondentes...
ele poderia subistituir
candidate instanceof T
por
candidate instanceof Cidade
é tão simples substituir isso quando subistituir no resto, não entendo a dificuldade real de fazer isso... mais enfim... paciencia...
e de toda forma... eu vi que realmente o erro de cast é dentro do filter... fiz o seguinte e comprovei...
|
Sun Certified Java Programmer (SCJP 6)
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999
Meu blog -> http://blog.tomazlavieri.com.br/ |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/04/2009 16:20:07
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
Lavieri wrote:candidate instanceof Cidade
é tão simples substituir isso quando subistituir no resto, não entendo a dificuldade real de fazer isso... mais enfim... paciencia...
É simples mas não tem lógica alguma. Raciocina...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/04/2009 17:48:15
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
Que tal isso aqui:
This message was edited 2 times. Last update was at 07/04/2009 17:52:30
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/04/2009 19:09:09
|
Lavieri
GUJ Master
![[Avatar]](/images/avatar/7b41bfa5085806dfa24b8c9de0ce567f.png)
Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline
|
eu acho triste, ter que informar a classe quando há tipologia...
hora, a tipologia devia vim para facilitar esse trabalho, ter q informar a classe em 2 lugares acho algo triste =/
mas talvez seja obrigado a fazer isso =/
This message was edited 1 time. Last update was at 07/04/2009 19:13:10
|
Sun Certified Java Programmer (SCJP 6)
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999
Meu blog -> http://blog.tomazlavieri.com.br/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/04/2009 19:40:30
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
Eu acho triste você querer coisas sem sentido.
Realmente cara, dá uma lida sobre Generics, aí tu vai entender como instanceof T não tem lógica. Depois você pode até continuar insatisfeito, mas pelo motivo certo (não vou te dizer, vou deixar pra você concluir).
This message was edited 2 times. Last update was at 07/04/2009 20:15:13
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/04/2009 11:51:21
|
victorwss
JWizard
![[Avatar]](/images/avatar/4ab232445f9b21b65dfdf6ea5f27f704.png)
Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline
|
Lavieri wrote:Que o compilador some com o T, eu sei... so que da mesma forma que ele subistitui os T por Cidade e cria os métodos correspondentes...
ele poderia subistituir
candidate instanceof T
por
candidate instanceof Cidade
é tão simples substituir isso quando subistituir no resto, não entendo a dificuldade real de fazer isso... mais enfim... paciencia...
Aí é que está o porém. O COMPILADOR NÃO FAZ ISSO. Ele substitui T por Object e ponto-final. Daí ele cria alguns casts e alguns métodos ocultos para lidar com a incompatibilidade.
Na verdade, a forma como generics foi implementado é uma gambiarra. E como toda boa gambiarra está cheia de problemas estranhos e regras obscuras. Eles implementaram assim para que não houvessem problemas de compatibilidade com java 1.4 e inferiores.
C++, por exemplo, faz essa substituição mais ou menos da mesma forma que você falou. Mas isso gera dois problemas:
1) Você tem centenas de classes sintéticas. Em C++, coisas como List<Cachorro>, List<Gato> e List<Integer> são diferentes. Além disso, trabalhar com coringas (aquele ?) seria muito mais complexo no java (C++ não tem coringas). No java, como o generic é apagado, você tem List simplesmente.
2) Problemas de compatibilidade com o java 1.4. Se o generic não fosse apagado do bytecode, seria necessário adicionar alguns atributos ocultos em diversas classes.
Além disso, há casos onde substituir não seria possível. Por exemplo:
Aqui, essa substituição não funcionaria. Na linha com o ***, ele deveria colocar o que? Integer? String? A única coisa que dá é Object mesmo. Se fosse substituir por Integer ou por String, teria que fazer isso para cada objeto, e isso iria requerer uma classe para cada tipo de objeto. Ainda assim ia ter alguns probleminhas quando uma superclasse tivesse um generic em um método final. Outra alternativa seria simplesmente mandar a compatibilidade com o java 1.4 e inferiores para o espaço, mas uma das bandeiras do java é justamente a retrocompatibilidade.
This message was edited 2 times. Last update was at 08/04/2009 11:57:11
|
Victor Williams Stafusa da Silva
Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.
Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.
Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.
É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).
Se você escreve "concerteza", "concerteza" você andou matando aulas de português. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2010 14:17:47
|
aeciovc
Java Ninja
Membro desde: 28/02/2008 21:15:34
Mensagens: 267
Localização: Recife
Offline
|
Eu acho triste você querer coisas sem sentido.
sem sentido??
eu vi sentido no que o Lavieri falou e concordo.
não entendi na falta de sentido ai.
uma justificativa pra que ele não faça isso pode ser:
Na verdade, a forma como generics foi implementado é uma gambiarra. E como toda boa gambiarra está cheia de problemas estranhos e regras obscuras. Eles implementaram assim para que não houvessem problemas de compatibilidade com java 1.4 e inferiores.
não um modelo da Linguagem Java.
|
Aécio Costa
www.aeciocosta.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2010 20:44:53
|
AbelBueno
Virtual Machine Man
Membro desde: 04/08/2010 09:37:57
Mensagens: 543
Offline
|
pois é, também acho que faz todo sentido...
quando se começar a usar generics cedo ou tarde você acaba tendo necessidade (ou desejo) similar...
os artigos abaixo explicam bem os motivos que fizeram generics ser implementado assim:
http://www.ibm.com/developerworks/java/library/j-jtp01255.html
http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/
e esse aqui uma forma NÃO recomendada de (talvez) contornar esse problema:
http://blog.caelum.com.br/2006/10/29/brincando-com-generics-o-bizarregenericdao/
apesar de entender os motivos dessa técnica de erasure eu realmente gostaria que generics tivesse mais poder...
|
|
|
 |
|
|