| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/11/2007 08:49:06
|
pardal_nb
Virtual Machine Man
Membro desde: 12/09/2006 08:26:06
Mensagens: 674
Offline
|
Pessoal,
estou lendo o livro da K&B e estouu no capítulo 3...onde fala sobre overloading com widening,k var-args, boxing...
nã compreendi mto bem como funciona..alguem poderia me ajudar?!
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/11/2007 10:42:39
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
Leia http://www.guj.com.br/posts/list/39326.java e depois diga o que não entendeu.
This message was edited 1 time. Last update was at 28/11/2007 10:44:13
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/11/2007 11:14:20
|
pardal_nb
Virtual Machine Man
Membro desde: 12/09/2006 08:26:06
Mensagens: 674
Offline
|
Sinceramente, não entendi mta coisa...tudo o que foi dito ele retirou do livro...o mesmo q tenho ...e continuo sem entender mto bem....
vou re-ler..e ler..e re-ler...novamente..
EDITADO
O que seria "precisa de widen"?
This message was edited 1 time. Last update was at 28/11/2007 11:19:33
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/11/2007 11:20:25
|
Ssalgado
JavaTeenager
Membro desde: 11/04/2005 12:51:05
Mensagens: 199
Offline
|
A melhor forma de entender é fazer testes e não ficar só na leitura.
Pega os testes do livro e roda. Debuga se for o caso.
Vai modificando os testes e devagarinho você vai entendendo o funcionamento da coisa,
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/11/2007 11:26:54
|
pardal_nb
Virtual Machine Man
Membro desde: 12/09/2006 08:26:06
Mensagens: 674
Offline
|
Ssalgado wrote:A melhor forma de entender é fazer testes e não ficar só na leitura.
Pega os testes do livro e roda. Debuga se for o caso.
Vai modificando os testes e devagarinho você vai entendendo o funcionamento da coisa,
Ssalgado, olhando o link que o sergiotaborda postou, onde o faelcavalcanti faz alguns testes, eu faria exatamente os mesmos testes...e te falo, eu compreendi o que ele tentou fazer...PORÉM, eu não tive a "sacada" da utilização do widening...
o que seria: vc tem q widen?
You can box and then widen. (An int can become an Object, via Integer.) [code]
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/11/2007 13:41:47
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
Widen ("alargar") significa promover. Quando é usado um int num argumento long o int é automáticamente "alargado" para caber no long.
Auto-boxing é a conversão automática de uma variável primitiva no seu Wrapper.
Então quando vc passa um int para um método que espera um long está acontecendo widening.
Quando vc passa um int para um método que espera um Integer está acontecendo auto-boxing.
Mas o que acontece quando vc tenta usar um método que está sobrecarregado e aceita os dois tipos?
Ou seja, vc está passando um int para um método que tanto aceita long como Integer.
Será seguida a primeira regra
"Primitive widening uses the "smallest" method argument possible."
É usado long e não Integer.
Mas e quando usamos var-arg ?
Aqui estamos passando na realidade um array de int como se fosse um array de long ou Integer.
Só que o facto é que estamos passando array. E um array é tão pequeno quanto outro array.
Logo a primeira regra não se aplica. A segunda diz
"Used individually, boxing and var-args are compatible with overloading. "
Ah! então significa que overloading, var-arg e boxing não são compatíveis quando usados juntos.
Por isso o compilador acusa um erro. E ele escolhe o primeiro método declarado para ser a vitima, dizendo que esse método é ambíguo.
É mais claro agora ?
This message was edited 1 time. Last update was at 29/11/2007 13:42:42
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/11/2007 13:50:30
|
pardal_nb
Virtual Machine Man
Membro desde: 12/09/2006 08:26:06
Mensagens: 674
Offline
|
sergiotaborda wrote:Widen ("alargar") significa promover. Quando é usado um int num argumento long o int é automáticamente "alargado" para caber no long.
Auto-boxing é a conversão automática de uma variável primitiva no seu Wrapper.
Então quando vc passa um int para um método que espera um long está acontecendo widening.
Quando vc passa um int para um método que espera um Integer está acontecendo auto-boxing.
Mas o que acontece quando vc tenta usar um método que está sobrecarregado e aceita os dois tipos?
Ou seja, vc está passando um int para um método que tanto aceita long como Integer.
Será seguida a primeira regra
"Primitive widening uses the "smallest" method argument possible."
É usado long e não Integer.
Mas e quando usamos var-arg ?
Aqui estamos passando na realidade um array de int como se fosse um array de long ou Integer.
Só que o facto é que estamos passando array. E um array é tão pequeno quanto outro array.
Logo a primeira regra não se aplica. A segunda diz
"Used individually, boxing and var-args are compatible with overloading. "
Ah! então significa que overloading, var-arg e boxing não são compatíveis quando usados juntos.
Por isso o compilador acusa um erro. E ele escolhe o primeiro método declarado para ser a vitima, dizendo que esse método é ambíguo.
É mais claro agora ?
Alto e claro sergiotaborda ...valeu mesmooo!
|
|
|
 |
|
|