SCJP: Sobrecarga na Combinação de Ampliação com Boxing

6 respostas
C

Pessoal, fiquei com uma dúvida lendo o capitulo 3.

Foi explicado que quando o compilador não encontra um método com o parametro do tipo exato passado para um método, ele vai amplia-lo para o próximo tipo mais baixo. No caso, o livro da o exemplo de um método que pede um long, e acaba recebendo um int. No caso o int é ampliado para long e tudo funciona, todos ficam felizes.

Agora, na próxima página são resumidas algumas regras a respeito de Sobrecarga-Boxing-Wide. E uma delas me chamou a atenção.

  • NÃO é possível ampliar e depois fazer boxing. (Um int não pode se tornar um Long).

Ué, achei que tendo um código semelhante a esse, funcionaria transformar um int para Long.

static void show (Long){
.... alguma ação ....
} 

static void main(Strings [] args){
 int i = 10;
 show(i);
}

Pelo que entendi, poderia ocorrer a seguinte situação. Eu passei um int, o compilador procura o mais próximo, ele não acha nem método com int nem método com long, apenas o Long. Nesse caso ele aceita que o método show(Long) seja usado, ampliando o int i para long, e depois o long para Long. Dessa forma, um int seria um Long ao contrário do que o livro disse.

Obrigado!

6 Respostas

galileu.gt

Olá,

O código abaixo não compila mesmo. O livro está correto. O compilador nao permite que seja feito uma ampliação (int para long), seguida do autoboxing (long para Long).

Já tentou compilar?

Abraço!

G

erro de compilação!

galileu.gt

poisé =P

é isso aí mesmo

yastorm

A ordem de busca é essa:

  1. Widening
  2. Autoboxing
  3. Var-args

Lembrando que não é possível realizar um Widening, e depois um AutoBoxing. Isto é, int transformar para um long, para depois transformar-se em um Long.

adercinho

Olá,

Primeiramente:
1 - int é um tipo primitivo, Long é um Objeto. Até aqui tudo bem ?
2 - Boxing é fazer uma conversão de um primitivo em Objeto. Exemplo(de int para Integer)
3 - Ampliação é por exemplo:

public static void main(String args[]){
  int x = 5;
  go(x);
}

static void go(long x){}

Passei um valor de tipo primitivo int menor do que o argumento do metodo go(long x) e o compilador conseguiu AMPLIAR. Se fosse ao contrario ele não conseguiria pois int cabe dentro de long mas já long não cabe dentro de int.

4 - O compilador só consegue fazer uma AMPLIAÇÃO de tipos de Objetos se passar no teste É-UM( ou instanceof) ou seja HERANÇA.

Agora vamos a analise do seu código:

static void show (Long){  
    .... alguma ação ....  
    }   
      
    static void main(Strings [] args){  
    int i = 10;  
    show(i);  
    }

1 - int vai fazer um BOXING para se transformar em Integer que é um Objeto. Até aqui tudo certo!
2 - o compilador vai tentar fazer a AMPLIAÇÃO do Integer para o Tipo Long que também é um Objeto. Só Integer não passa no teste E-UM ou seja Integer não extends de Long

Já no exemplo abaixo funcionaria pois Byte passa no teste É-UM. Pois toda Classe extends de Object exceto ela mesma.

class BoxAndWiden{

static void go(Object o){
Byte b2 = (Byte) o; ok - é um objeto Byte
System.out.println(b2);
}

public static void main(String [] args){
byte b = 5;
go(b);
}
}

saida:

5

Espero ter Ajudado !!!

F
adercinho:
Olá,

Primeiramente:
1 - int é um tipo primitivo, Long é um Objeto. Até aqui tudo bem ?
2 - Boxing é fazer uma conversão de um primitivo em Objeto. Exemplo(de int para Integer)
3 - Ampliação é por exemplo:

public static void main(String args[]){
  int x = 5;
  go(x);
}

static void go(long x){}

Passei um valor de tipo primitivo int menor do que o argumento do metodo go(long x) e o compilador conseguiu AMPLIAR. Se fosse ao contrario ele não conseguiria pois int cabe dentro de long mas já long não cabe dentro de int.

4 - O compilador só consegue fazer uma AMPLIAÇÃO de tipos de Objetos se passar no teste É-UM( ou instanceof) ou seja HERANÇA.

Agora vamos a analise do seu código:

static void show (Long){  
    .... alguma ação ....  
    }   
      
    static void main(Strings [] args){  
    int i = 10;  
    show(i);  
    }

1 - int vai fazer um BOXING para se transformar em Integer que é um Objeto. Até aqui tudo certo!
2 - o compilador vai tentar fazer a AMPLIAÇÃO do Integer para o Tipo Long que também é um Objeto. Só Integer não passa no teste E-UM ou seja Integer não extends de Long

Já no exemplo abaixo funcionaria pois Byte passa no teste É-UM. Pois toda Classe extends de Object exceto ela mesma.

class BoxAndWiden{

static void go(Object o){
Byte b2 = (Byte) o; ok - é um objeto Byte
System.out.println(b2);
}

public static void main(String [] args){
byte b = 5;
go(b);
}
}

saida:

5

Espero ter Ajudado !!!

muito bem explicado :)

Criado 4 de junho de 2010
Ultima resposta 1 de mar. de 2013
Respostas 6
Participantes 6