Preťaženie metódy a nulová chyba v jazyku Java

V Jave je veľmi bežné preťažovať metódy. Nižšie je zaujímavý program 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  );      }   }   

výstup:

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 

Dôvodom, prečo vo vyššie uvedenom scenári dostávame chybu času kompilácie, sú argumenty metódy Integer a String, ktoré nie sú primitívne dátové typy v Jave. To znamená, že akceptujú nulové hodnoty. Keď odovzdáme nulovú hodnotu metóde1, kompilátor je zmätený, ktorú metódu má vybrať, pretože obe akceptujú nulu. Táto chyba v čase kompilácie by sa nestala, pokiaľ by sme zámerne neodovzdali hodnotu null. Pozrite si napríklad scenár nižšie, ktorý vo všeobecnosti sledujeme pri kódovaní. 

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

výstup:

fun(Integer )  

Ak je vo vyššie uvedenom scenári hodnota 'arg' nulová kvôli výsledku výrazu, potom sa nulová hodnota odovzdá metóde1. Tu by sme nedostali chybu času kompilácie, pretože špecifikujeme, že argument je typu Integer, preto kompilátor vyberie metódu1 (Integer i) a spustí kód v nej. Poznámka: Tento problém nebude pretrvávať, ak sú argumenty prepísanej metódy primitívneho typu údajov. Pretože kompilátor vyberie najvhodnejšiu metódu a vykoná ju.