"השיטה X אובטחת עבור הסוג Y" שגיאת קריאת שיטה דו־משמעית ב-Java עם ערך null

אם אתה קורא את זה, יש סיכוי שקיבלת את שגיאת השיטה X אמביגואוסה עבור הסוג Y בעת קידוד תוכנית Java בטרמינל או בכל סביבת פיתוח Java אחרת.

שיחת שיטה אמביגואוסה ב-Java

כאן אני הולך להסביר מדוע שגיאת שיחת שיטה אמביגואוסה ב-Java מתרחשת עם דוגמאות מסוימות. שגיאת שיחת שיטה אמביגואוסה זו תמיד מתרחשת עם עומס של שיטות בהם מהדר נכשל לזהות איזו מהשיטות המוטענות צריך להשתמש. נניח שיש לנו תוכנית Java כמו שלמטה.

package com.journaldev.errors;

public class Test {

	public void foo(Object o) {
		System.out.println("Object");
	}

	public void foo(String s) {
		System.out.println("String");
	}
	public static void main(String[] args) {
		new Test().foo(null);
	}

}

התוכנית למעלה קודם תקיעה באופן מושלם וכאשר אנו מריצים אותה, היא מדפיסה "String". לכן השיטה foo(String s) נקראה על ידי התוכנית. הסיבה לכך היא שמהדר Java מנסה למצוא את השיטה עם הפרמטרים הכניסה המדוייקים ביותר כדי להפעיל שיטה. אנו יודעים ש-Object הוא המחלקה האב של String, לכן הבחירה הייתה פשוטה. הנה ציטוט מהרקע לשפת Java.

אם יש יותר משיטת חבר נגישה וניתנת להחלפה עבור קריאת שיטה … שפת התכנות Java משתמשת בכלל שהשיטה המדוייקת ביותר תיבחר.

הסיבה שאני מעביר "null" היא כי זה עובד עבור כל סוג של ארגומנטים, אם נעביר אובייקטים אחרים, הבחירה של המהדר של Java היא פשוטה.

שיטת X אמביגואית עבור הסוג Y

עכשיו בואו להוסיף שיטה לקוד למעלה.

public void foo(Integer i){
	System.out.println("Integer");
}

תקבלו שגיאת זמן קומפילציה עם הודעה The method foo(Object) is ambiguous for the type Test משום שגם למחלקות String ו-Integer יש את Object כמחלקה האם, ואין ירושה. לכן, מהדהדת קומפילטר Java לא יחשוב על אף אחת מהן כמוגדרת באופן יותר ספציפי, ולכן יתרחש שגיאה בקריאת השיטה.

package com.journaldev.strings;

public class Test {

	public void foo(Object o) {
		System.out.println("Object");
	}

	public void foo(Exception e) {
		System.out.println("Exception");
	}

	public void foo(NullPointerException ne) {
		System.out.println("NullPointerException");
	}

	public static void main(String[] args) {
		new Test().foo(null);
	}

}

כפי שהוסבר למעלה, כאן foo(NullPointerException ne) היא השיטה הכי ספציפית משום שהיא יורשת ממחלקת Exception, ולכן הקוד הזה יתממש בהצלחה ובעת הרצה ידפיס "NullPointerException". אני מקווה שמאמר זה מבהיר כל ספק שיש לך לגבי שגיאת קריאה לשיטה אמביגואית ב-Java. אנא הוסף הערה אם יש לך משהו להוסיף או אם יש לך סבלנות עם זה.

Source:
https://www.digitalocean.com/community/tutorials/the-method-is-ambiguous-for-the-type-java-ambiguous-method-call-null-error