Metodöverbelastning och nollfel i Java

I Java är det mycket vanligt att överbelasta metoder. Nedan finns ett intressant Java-program. 

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

Utgång:

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 

Anledningen till att vi får kompileringstidsfel i scenariot ovan är här metodargumenten Integer och String är båda inte primitiva datatyper i Java. Det betyder att de accepterar nollvärden. När vi skickar ett nollvärde till metod1 blir kompilatorn förvirrad vilken metod den måste välja eftersom båda accepterar nollvärdet. Detta kompileringstidsfel skulle inte hända om vi inte avsiktligt skickar ett nollvärde. Se till exempel scenariot nedan som vi följer generellt vid kodning. 

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

Utgång:

fun(Integer )  

Om 'arg'-värdet i ovanstående scenario är null på grund av resultatet av uttrycket skickas nullvärdet till metod1. Här skulle vi inte få kompileringstidsfel eftersom vi anger att argumentet är av typen Integer, därför väljer kompilatorn metod1(Integer i) och kommer att exekvera koden i det. Obs: Det här problemet skulle inte kvarstå när de åsidosatta metodargumenten är primitiva datatyper. Eftersom kompilatorn väljer den mest lämpliga metoden och kör den.