Přetížení metody a chyba null v Javě

V Javě je velmi běžné přetěžování metod. Níže je zajímavý 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  );      }   }   

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ůvodem, proč ve výše uvedeném scénáři dostáváme chybu času kompilace, jsou argumenty metody Integer a String, oba nejsou primitivní datové typy v Javě. To znamená, že přijímají nulové hodnoty. Když předáme hodnotu null metodě1, kompilátor je zmatený, kterou metodu má vybrat, protože obě přijímají hodnotu null. K této chybě v době kompilace nedojde, pokud záměrně nepředáme hodnotu null. Podívejte se například na níže uvedený scénář, kterým se obecně řídíme při kódování. 

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 )  

Pokud je ve výše uvedeném scénáři hodnota 'arg' nulová kvůli výsledku výrazu, pak je nulová hodnota předána metodě1. Zde bychom nedostali chybu doby kompilace, protože zadáváme, že argument je typu Integer, takže kompilátor vybere metodu1 (Integer i) a spustí kód uvnitř. Poznámka: Tento problém nebude přetrvávat, pokud jsou argumenty přepsané metody primitivního datového typu. Protože kompilátor vybere nejvhodnější metodu a provede ji.