Sobrecarga?

6 respostas
P

Folks,

qual diferença :

--não compila situação 1
public class WindenBox {
	static void go(Long x){
		System.out.println("Long");
	}
	public static void main(String[]args){
	int  b=5;
	go(b);
	//precisa ampliar para depois fazer o boxing NAO É VALIDO isso
	//é muita coisa para o compilador.
	}}

e essa situação :

--compila situação 2
public class WindenBox {
	static void go(Long x){
		System.out.println("Long");
	}
	public static void main(String[]args){
	long  b=5;
	go(b);
	//precisa ampliar para depois fazer o boxing NAO É VALIDO isso
	//é muita coisa para o compilador.
	}}

não faz sobrecarga na situação 1 …

6 Respostas

renanpto

É que o autoboxing nao funciona para tipos diferentes.

Situacoes:

int para Long -  nao funfa
int para long - funfa

Acho q é isso.

Flw

bruno.leite
--não compila situação 1  
public class WindenBox {  
     static void go(Long x){  
         System.out.println("Long");  
     }  
     public static void main(String[]args){  
     int  b=5;  
     go(b);  
     //precisa ampliar para depois fazer o boxing NAO É VALIDO isso  
     //é muita coisa para o compilador.  
     }}

Esse caso não compila porque o compilador deve fazer a ampliação (de int para long) e após fazer o boxing, o compilador só realiza boxing de tipos iguais, por exemplo ‘int para Integer’, ‘short para Short’ e etc…

--compila situação 2  
 public class WindenBox {  
     static void go(Long x){  
         System.out.println("Long");  
     }  
     public static void main(String[]args){  
     long  b=5;  
     go(b);  
     //precisa ampliar para depois fazer o boxing NAO É VALIDO isso  
     //é muita coisa para o compilador.  
    }}

esse caso compila porque ele deve somente realizar o boxing, pois os tipos são iguais

--não compila situação 3
 public class WindenBox {  
     static void go(Long x){  
         System.out.println("Long");  
     }  
     public static void main(String[]args){  
     Integer  b=5;  
     go(b);  
     //Não existe ampliação de tipos wrappers

Não existe ampliação de tipos wrappers, ou seja, ele não transforma (Short em Integer) e assim por diante, pois Short não é subclasse de Integer.

andrepestana

Paribe,

a resposta está escrita na própria pergunta:

Sempre que for preciso ampliar (no caso de int para long) para depois fazer o autoboxing (no caso para Long) não irá compilar.

Agora, se for preciso fazer apenas o autoboxing, a classe compila e funciona perfeitamente. (long -> Long =autoboxing)

abraço,

W

cara é simples… lance de ampliacao do existe para primitivos.

e o boxing do primitivo so acontece para seu Wrapper correspondente… uma classe wrapper nunca e compativel com outra, o porque disso é que nenhuma das classes wrapper extende a outra, é so pensar nas classes Wrapper como um objeto comum, verifica a hierarquia do Objeto e vê se eles tem alguma superclasse em comum.

agora se o metodo fosse

static void go(Number x){    
          System.out.println("Number");    
     }

ele aceitaria porque todos os wrappers extendem Number, e se fosse Object tambem funcionaria… manjou ? :wink:

W

agora não se esquece que quando um primitivo e ampliado para outro impritivo… tipo
um int virou um long…
vc pode usar a nova referencia desse long e invocar um metodo que espere um Long…

public static void main(String[] args) {
    	int n = 3;
    	wide(n);
    }
    
	static void wide(long a){
	wrap(a);
	}

	static void wrap(Long b){
//		codigo chega aqui normalmente
		System.out.println(b);
	}
sergiotaborda

paribe:

não faz sobrecarga na situação 1 …

Lembre-se que o Java nunca destroirá seus dados. Ou seja, ele é type-safe.
As regras de type-safety aplicam-se mesmo quando é o java fazendo as coisas difíceis.

Se vc tentar passar um int para um Long não funciona porque isso significaria

  1. Passar int para Integer

  2. Passar Integer onde Long é esperado

  3. é auto-boxing e funciona, mas 2) não é type-safe. É como passar Integer onde String é esperado.
    Não ha promoção automática de classes e por isso não funciona. Promoção só de primitivos (int -> long)

Criado 13 de agosto de 2008
Ultima resposta 13 de ago. de 2008
Respostas 6
Participantes 6