Pessoal eu estava lendo o livro da Kathy sobre boxing e unboxing, quando me surgio duvida sobre o assunto.
Exemplo dado o codigo a baixo o que acontece :?:
publicstaticvoidteste(Byteb){System.out.println("Usando wrapper Byte");}publicstaticvoidteste(Objecto){Byteb=(Byte)o;System.out.println("Usando a ampliação"+b);}publicstaticvoidmain(String[]args){bytex=5teste(x);}
a saida que deu aqui no eclipse de casa foi "Usando wrapper Byte", mas eu estava certo que iria sair "Usando a ampliação 5" pois como o livro mostra a compilador prefere ampliar do que fazer boxing....
O seu teste está errado. Se quiser checar a tal "ampliação" (Widening), faça com este programa:
classTest{// Isto é o "Boxing"publicstaticvoidteste(Byteb){System.out.println("Usando wrapper Byte");}// Isto é o "widening" (Ampliação)publicstaticvoidteste(longL){System.out.println("Usando a ampliação");}// Isto não é uma coisa nem outrapublicstaticvoidteste(Objectobj){System.out.println("Não usando nem Widening nem Boxing");}publicstaticvoidmain(String[]args){bytex=5;// Ele tem as opções de efetuar o "widening" (byte -> long)// ou o boxing (byte -> java.lang.Byte). // Note que a opção Object não é "widening" nem "boxing".teste(x);}}
LPJava
bom, nao tem pq ele chamar o Object, ja que byte é um primitivo… se ele nao encontrar um correspondente ele nao compila… mas como no java 5 tem o autoboxing ele faz de byte para Byte, remova ai o metodo que tem o Byte para ver se ele faz o autoboxing para Object e depois par Byte, segundo a kathy isso era muita coisa para o compilador.
R
RafaelVS
thingol:
O seu teste está errado. Se quiser checar a tal "ampliação" (Widening), faça com este programa:
classTest{// Isto é o "Boxing"publicstaticvoidteste(Byteb){System.out.println("UsandowrapperByte");}// Isto é o "widening" (Ampliação)publicstaticvoidteste(longL){System.out.println("Usandoaampliação");}// Isto não é uma coisa nem outrapublicstaticvoidteste(Objectobj){System.out.println("NãousandonemWideningnemBoxing");}publicstaticvoidmain(String[]args){bytex=5;// Ele tem as opções de efetuar o "widening" (byte -> long)// ou o boxing (byte -> java.lang.Byte). // Note que a opção Object não é "widening" nem "boxing".teste(x);}}
Na verdade, a opção Object é ambos e nesta ordem: boxing + widening. Se só tivesse essa opção, o byte primitivo seria boxed para Byte e então widened para Object.
Omeganosferatu
O problema é que voce usa um byte primitivo e tem um método com uma chamada pra Byte ( box de byte ), portanto ele prefere fazer o box, a ampliação seria feita se você tivesse algum outro método com algum primitivo.
publicstaticvoidteste(Byteb){System.out.println("Usando wrapper Byte");}publicstaticvoidteste(intb){System.out.println("Usando int");}publicstaticvoidteste(Objecto){Byteb=(Byte)o;System.out.println("Usando a ampliação"+b);}publicstaticvoidmain(String[]args){bytex=5;teste(x);}
Dessa forma ele chamaria o int, pra chamar object, voce teria que omitir o método com um wrapper Byte e omitir ou modificar o método do int pra um wrapper Integer
LPJava
so mais uma dica… os novos recursos seria a ultima coisa que ele faria ai… como autoboxing, vargs… como Omeganosferatu falou se tivesse um primitivo "int " por exemplo esse seria chamado ao inves do da ampliação para o Byte isso por questao de compatibilidade até… ja que o autoboxings so ta presente a partir do java 1.5.