Overloading com widening

6 respostas
P

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?!

6 Respostas

sergiotaborda

Leia http://www.guj.com.br/posts/list/39326.java e depois diga o que não entendeu.

P

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”?

S

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,

P
Ssalgado:
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?

[quote] You can box and then widen. (An int can become an Object, via Integer.) [code]

sergiotaborda

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 ?

P

sergiotaborda:
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!

Criado 28 de novembro de 2007
Ultima resposta 29 de nov. de 2007
Respostas 6
Participantes 3