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  (  &  quot  ;  fun  (  Integer     )     &  quot  ;);      }      public     void     fun  (  String     name  )      {      System  .  out  .  println  (  &  quot  ;  fun  (  String     )     &  quot  ;);      }      // 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  (  &  quot  ;  fun  (  Integer     )     &  quot  ;);      }      public     void     fun  (  String     name  )      {      System  .  out  .  println  (  &  quot  ;  fun  (  String     )     &  quot  ;);      }      // 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á.