logo

Sobrecarga de método e erro nulo em Java

Em Java é muito comum sobrecarregar métodos. Abaixo está um programa Java interessante. 

Java
public class Test {  // Overloaded methods  public void fun(Integer i)  {  System.out.println("fun(Integer ) ");  }  public void fun(String name)  {  System.out.println("fun(String ) ");  }  // Driver code   public static void main(String [] args)  {  Test mv = new Test();  // This line causes error  mv.fun(null);  } } 

Saída :



22: error: reference to fun is ambiguous mv.fun(null); ^ both method fun(Integer) in Test and method fun(String) in Test match 1 error

A razão pela qual obtemos um erro de tempo de compilação no cenário acima é que aqui os argumentos do método Integer e String não são tipos de dados primitivos em Java. Isso significa que eles aceitam valores nulos. Quando passamos um valor nulo para o método1, o compilador fica confuso sobre qual método deve selecionar, pois ambos estão aceitando o nulo. Este erro de tempo de compilação não aconteceria a menos que passássemos intencionalmente o valor nulo. Por exemplo, veja o cenário abaixo que geralmente seguimos durante a codificação. 

Java
public class Test {  // Overloaded methods  public void fun(Integer i)  {  System.out.println("fun(Integer ) ");  }  public void fun(String name)  {  System.out.println("fun(String ) ");  }  // Driver code  public static void main(String [] args)  {  Test mv = new Test();    Integer arg = null;  // No compiler error  mv.fun(arg);  } } 

Saída :

fun(Integer ) 

No cenário acima, se o valor 'arg' for nulo devido ao resultado da expressão, o valor nulo será passado para o método1. Aqui não obteríamos erro de tempo de compilação porque estamos especificando que o argumento é do tipo Integer, portanto, o compilador seleciona o método1 (Integer i) e executará o código dentro dele. Nota: Este problema não persistiria quando os argumentos do método substituído fossem do tipo de dados primitivo. Porque o compilador selecionará o método mais adequado e o executará.