Dúvida genéricos  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
nbluis
GUJ Master
[Avatar]

Membro desde: 27/05/2006 01:31:51
Mensagens: 1531
Localização: Porto Alegre - RS
Offline

Mas o debate é legal.

Olha um comportamento engraçado que eu testei agora.

Suponha que voce tenha uma classe cachorro ok ?
A saida:


Se eu faço o seguinte:

Colocando uma chamada a lista4.get(0) que é o objeto Cachorro.
Acontece um erro:

Se chamo qualquer outro funciona beleza.

Não fui muito a fundo, mas parece que como na implementação do ArrayList ele armazena em um Object[] dentro da lista ele continua trabalhando mesmo com um objeto inválido.
E quando fazemos o get, por fazer referência ao generico String ele tenta fazer o cast e quebra tudo.

As vezes a gente encontra umas coisas engraçadas estudando estes exemplos.

Luis Eduardo Bohrer

Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
[WWW]
C?ar.Rodolfo
HelloWorld
[Avatar]

Membro desde: 14/07/2009 08:36:51
Mensagens: 12
Offline

Ué aquele primeiro codigo funcionou ake no NetBeans...
Não ta dando certo pq ele converteu pra ArrayList<Number>?

SCJP 6.0
Mata teu tempo e matará tua carreira...
C?ar.Rodolfo
HelloWorld
[Avatar]

Membro desde: 14/07/2009 08:36:51
Mensagens: 12
Offline

Isso ake tbm é valido?

ArrayList<? extends Number> c = new ArrayList<Integer>();

SCJP 6.0
Mata teu tempo e matará tua carreira...
vmsb11
Java Ninja

Membro desde: 25/08/2008 12:35:00
Mensagens: 251
Offline

Isto funciona mas vc não poderá adicionar nada na lista....
vmsb11
Java Ninja

Membro desde: 25/08/2008 12:35:00
Mensagens: 251
Offline

nbluis wrote:Mas o debate é legal.

Olha um comportamento engraçado que eu testei agora.

Suponha que voce tenha uma classe cachorro ok ?
A saida:


Se eu faço o seguinte:

Colocando uma chamada a lista4.get(0) que é o objeto Cachorro.
Acontece um erro:

Se chamo qualquer outro funciona beleza.

Não fui muito a fundo, mas parece que como na implementação do ArrayList ele armazena em um Object[] dentro da lista ele continua trabalhando mesmo com um objeto inválido.
E quando fazemos o get, por fazer referência ao generico String ele tenta fazer o cast e quebra tudo.

As vezes a gente encontra umas coisas engraçadas estudando estes exemplos.


Engraçado msm esses exemplos.... por isso é válido algumas vezes abrir o código fonte e ver como que é a implementação das coleções no java....
C?ar.Rodolfo
HelloWorld
[Avatar]

Membro desde: 14/07/2009 08:36:51
Mensagens: 12
Offline

Ah vlw ^^
E quanto ao primeiro codigo?
Aki deu certim, estranhissimo XD

SCJP 6.0
Mata teu tempo e matará tua carreira...
vmsb11
Java Ninja

Membro desde: 25/08/2008 12:35:00
Mensagens: 251
Offline

estranho msm....
aqui o primeiro código funcionou no eclipse....
mas no java normal não funcionou....
LPJava
GUJ Hacker

Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline

pessoal, veja as linhas abaixo:





sao diferentes o cast que está sendo feito.

Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
[WWW]
C?ar.Rodolfo
HelloWorld
[Avatar]

Membro desde: 14/07/2009 08:36:51
Mensagens: 12
Offline

ArrayList<Number> lista1 = (ArrayList<Number>m.criarLista3();

Esse cast não deveria funcionar...
Pelo menos eu acho né ^^

SCJP 6.0
Mata teu tempo e matará tua carreira...
LPJava
GUJ Hacker

Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline

C?ar.Rodolfo wrote:ArrayList<Number> lista1 = (ArrayList<Number>m.criarLista3();

Esse cast não deveria funcionar...
Pelo menos eu acho né ^^


ele nao vai mesmo, se funcionasse eu poderia colocar qualquer coisa no meu array do tipo <Number> e isso nao eh permitido.

Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
[WWW]
vmsb11
Java Ninja

Membro desde: 25/08/2008 12:35:00
Mensagens: 251
Offline

Compilei esse código no console do java msm

E esse casting funcionou sim!!!!!!!!!....deu uma warning mas funcionou....

This message was edited 1 time. Last update was at 30/12/2009 13:42:42

LPJava
GUJ Hacker

Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline

e pq ele nao funcionaria? nao vejo nada de errado nele. vc tem um metodo que retornar um ou qualquer coisa que seja filho de Number.



aqui vc declaracou uma lista que vai receber o resultado o metodo que retorna um Number.

E depois vc adicionou um objeto Float no seu conjunto lista1 que está referenciado ao metodo que retorna

ele imprime com warnings pq a seguranca ai foi para o saco, ja que vc quebrou ela. isso ai eh o mesmo disso:


ja isso aqui nao compila:

Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
[WWW]
vmsb11
Java Ninja

Membro desde: 25/08/2008 12:35:00
Mensagens: 251
Offline

sim....isso ai eu ja entendi....
oque me deixou em dúvida é porq no retorno do método

retornei um array list de integer(até ai tudo bem, faz parte da regra de retorno que defini) mas na hora que eu faço casting

isso no meu entendimento está passando um array list de integer para number certo????
então oque eu entendi quando o tipo de retorno do método é <? extends ClasseX> eu posso fazer um casting de um subtipo para um supertipo na hora de chamar o método como eu fiz, está certo????
muito obrigado pela ajuda LPJava.
LPJava
GUJ Hacker

Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline

vmsb11 wrote:sim....isso ai eu ja entendi....
oque me deixou em dúvida é porq no retorno do método

retornei um array list de integer(até ai tudo bem, faz parte da regra de retorno que defini) mas na hora que eu faço casting

isso no meu entendimento está passando um array list de integer para number certo????
então oque eu entendi quando o tipo de retorno do método é <? extends ClasseX> eu posso fazer um casting de um subtipo para um supertipo na hora de chamar o método como eu fiz, está certo????
muito obrigado pela ajuda LPJava.


qualquer um que passe no teste É-UM vc pode retornar quando se tem X extends Y.

Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
[WWW]
vmsb11
Java Ninja

Membro desde: 25/08/2008 12:35:00
Mensagens: 251
Offline

entendi tudo LPJava....obrigado pela ajuda....
só tenho mais uma dúvida com relação a casting em genéricos....

quando eu faço:


mas quando eu declaro algo do tipo:


estou correto nisso?????....
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team