Java

Saturday, April 22, 2006

 

sobrecarga

Algumas regras para a sobrecarga de métodos.

1. Métodos com parâmetros primitivos têm preferência sobre métodos com parâmetros do tipo Wrapper:

public void fazAlgo(int x){}

public void fazAlgo(Integer x){}

public void chamaFazAlgo(){
fazAlgo(5);
}


Se o método fazAlgo(int x) não existisse, o autoboxing entraria em operação e o compilador chamaria adequadamente fazAlgo(Integer x). Como ambos os métodos existem, o primeiro tem preferência.

2. Métodos com parâmetros primitivos têm preferência sobre métodos com a sintaxe de var-args:

public void fazAlgo(int x, int y){}

public void fazAlgo(int... x){}

public void chamaFazAlgo(){
fazAlgo(5,5);
}


3. Métodos com parâmetros do tipo Wrapper têm preferência sobre métodos com a sintaxe de var-args:

public void fazAlgo(Integer x, Integer y){}

public void fazAlgo(int... x){}

public void chamaFazAlgo(){
fazAlgo(5,5);
}

O compilador opta por colocar em operação o autoboxing, convertendo os argumentos 5, 5 para objetos da classe wrapper equivalente, no caso, Integer, chamando, então, o método fazAlgo(Integer x, Integer y).

4. O compilador também pode converter tipos primitivos para outros que não causem perda de informação antes de chamar um método:

public void fazAlgo(int x){}
public void chamaFazAlgo(){
byte b=5;
fazAlgo(b);
}


5. No entanto, o compilador não pode, ao mesmo tempo, converter primitivos para outros que não causem perda de informação e depois empregar autoboxing para chamar um método. Isso não é legal:

public void fazAlgo(Integer x){}
public void chamaFazAlgo(){
byte b=5;
fazAlgo(b);
}


6. Mas o inverso é possível, isto é, o compilador pode empregar autoboxing e depois converter um wrapper para outro objeto e chamar um método (mas lembre-se que objetos wrapper não possuem entre si relações de parentesco):

public void fazAlgo(Object x){}
public void chamaFazAlgo(){
byte b=5;
fazAlgo(b);
}

Neste caso, o compilador emprega autoboxing, transformando o byte b em um objeto Byte e, em seguida, o converte para uma instância de Object, chamando, enfim, o método fazAlgo(Object x).

Comments: Post a Comment



<< Home

Archives

March 2006   April 2006   May 2006   July 2006   August 2006  

This page is powered by Blogger. Isn't yours?