Dvida boxing e unboxing!

5 respostas
Raff
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 :?:
public static void teste(Byte b){

System.out.println("Usando wrapper Byte");
}

public static void teste(Object o){

Byte b = (Byte)o;

System.out.println("Usando a ampliação"+b);
}

public static void main(String [] args){
byte x = 5
teste(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....

Pessoal por favor me esclareça essa duvida...

5 Respostas

T

O seu teste está errado. Se quiser checar a tal "ampliação" (Widening), faça com este programa:

class Test{
    // Isto é o "Boxing"
    public static void teste(Byte b){
 
        System.out.println("Usando wrapper Byte");
    }
 
    // Isto é o "widening" (Ampliação)
    public static void teste (long L) {
        System.out.println("Usando a ampliação");
    }
    // Isto não é uma coisa nem outra
    public static void teste (Object obj) {
        System.out.println ("Não usando nem Widening nem Boxing");
    } 
  
    public static void main(String [] args){
        byte x = 5;
        // Ele tem as opções de efetuar o "widening" (byte -&gt long)
        // ou o boxing (byte -&gt 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
thingol:
O seu teste está errado. Se quiser checar a tal "ampliação" (Widening), faça com este programa:
class Test{
    // Isto é o "Boxing"
    public static void teste(Byte b){
 
        System.out.println("Usando wrapper Byte");
    }
 
    // Isto é o "widening" (Ampliação)
    public static void teste (long L) {
        System.out.println("Usando a ampliação");
    }
    // Isto não é uma coisa nem outra
    public static void teste (Object obj) {
        System.out.println ("Não usando nem Widening nem Boxing");
    } 
  
    public static void main(String [] args){
        byte x = 5;
        // Ele tem as opções de efetuar o "widening" (byte -&gt long)
        // ou o boxing (byte -&gt 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.

public static void teste(Byte b){
 
 System.out.println("Usando wrapper Byte");
 }

public static void teste( int b ) {
   System.out.println( "Usando int" );
}
 
 public static void teste(Object o){
 
 Byte b = (Byte)o;
 
 System.out.println("Usando a ampliação"+b);
 }
 
 public static void main(String [] args){
 byte x = 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.

Criado 16 de julho de 2007
Ultima resposta 17 de jul. de 2007
Respostas 5
Participantes 5