ב-Java מאוד נפוץ להעמיס שיטות. להלן תוכנית Java מעניינת.
Javapublic class Test { // Overloaded methods public void fun(Integer i) { System.out.println("fun(Integer ) "); } public void fun(String name) { System.out.println("fun(String ) "); } // 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("fun(Integer ) "); } public void fun(String name) { System.out.println("fun(String ) "); } // 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) ויבצע את הקוד שבתוכו. הערה: בעיה זו לא תימשך כאשר הארגומנטים של השיטה שנעקפו הם מסוג נתונים פרימיטיביים. כי המהדר יבחר את השיטה המתאימה ביותר ויבצע אותה.