Sobrecarga de métodos y error nulo en Java

En Java es muy común sobrecargar métodos. A continuación se muestra un interesante programa Java. 

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  );      }   }   

Producción :

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 

La razón por la que obtenemos un error de tiempo de compilación en el escenario anterior es que aquí los argumentos del método Integer y String no son tipos de datos primitivos en Java. Eso significa que aceptan valores nulos. Cuando pasamos un valor nulo al método1, el compilador se confunde sobre qué método debe seleccionar, ya que ambos aceptan el valor nulo. Este error en tiempo de compilación no ocurriría a menos que pasemos intencionalmente un valor nulo. Por ejemplo, vea el siguiente escenario que seguimos generalmente mientras codificamos. 

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  );      }   }   

Producción :

fun(Integer )  

En el escenario anterior, si el valor 'arg' es nulo debido al resultado de la expresión, entonces el valor nulo se pasa al método1. Aquí no obtendríamos un error de tiempo de compilación porque especificamos que el argumento es de tipo Integer, por lo tanto, el compilador selecciona el método1 (Integer i) y ejecutará el código dentro de él. Nota: Este problema no persistirá cuando los argumentos del método anulado sean de tipo de datos primitivos. Porque el compilador seleccionará el método más adecuado y lo ejecutará.