Metódus túlterhelés és null hiba a Java-ban

Java-ban nagyon gyakori a metódusok túlterhelése. Az alábbiakban egy érdekes Java program látható. 

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

Kimenet:

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 

Az ok, amiért a fenti forgatókönyvben fordítási időhibát kapunk, az az, hogy itt az Integer és a String metódusargumentumok nem primitív adattípusok a Java-ban. Ez azt jelenti, hogy elfogadják a null értékeket. Amikor null értéket adunk át a metódus1-nek, a fordító összezavarodik, hogy melyik metódust kell kiválasztania, mivel mindkettő elfogadja a nullát. Ez a fordítási időhiba csak akkor fordul elő, ha szándékosan null értéket adunk át. Lásd például az alábbi forgatókönyvet, amelyet általában követünk a kódolás sorá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  );      }   }   

Kimenet:

fun(Integer )  

A fenti forgatókönyvben, ha az 'arg' érték nulla a kifejezés eredménye miatt, akkor a null értéket adjuk át a metódusnak. Itt nem kapunk fordítási időt, mert azt adjuk meg, hogy az argumentum Integer típusú, ezért a fordító kiválasztja a metódus1 (Integer i)-t, és végrehajtja a kódot abban. Megjegyzés: Ez a probléma nem marad fenn, ha a felülírt metódusargumentumok primitív adattípusúak. Mert a fordító kiválasztja a legmegfelelőbb módszert és végrehajtja.