עומס יתר של שיטה ושגיאת null ב-Java

ב-Java מאוד נפוץ להעמיס שיטות. להלן תוכנית 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  );      }   }   

פלט:

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 

הסיבה שבגללה אנו מקבלים שגיאת זמן קומפילציה בתרחיש שלעיל היא כאן ארגומנטי השיטה Integer ו-String שניהם אינם סוגי נתונים פרימיטיביים ב-Java. זה אומר שהם מקבלים ערכים אפסים. כאשר אנו מעבירים ערך null ל-method1 המהדר מתבלבל באיזו שיטה עליו לבחור מכיוון ששניהם מקבלים את ה-null. שגיאת זמן ההידור הזו לא תתרחש אלא אם נעביר בכוונה ערך null. לדוגמה, ראה את התרחיש שלהלן שאנו עוקבים אחריו באופן כללי בזמן הקידוד. 

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

פלט:

fun(Integer )  

בתרחיש שלמעלה אם הערך 'arg' הוא null עקב תוצאת הביטוי אז הערך null מועבר ל-method1. כאן לא נקבל שגיאת זמן קומפילציה מכיוון שאנו מציינים שהארגומנט הוא מסוג Integer ולכן המהדר בוחר את method1(Integer i) ויבצע את הקוד שבתוכו. הערה: בעיה זו לא תימשך כאשר הארגומנטים של השיטה שנעקפו הם מסוג נתונים פרימיטיביים. כי המהדר יבחר את השיטה המתאימה ביותר ויבצע אותה.