إذا كنت تقرأ هذا، فإن هناك فرصة كبيرة أنك واجهت خطأ The method X is ambiguous for the type 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");
}
ستحصل على خطأ في وقت الترجمة كما يلي
الطريقة foo(Object) غير واضحة للنوع Test
لأن كلاً من فئتي String و Integer لديهما Object كفئة أب ولا توجد وراثة. لذلك لا يعتبر مترجم الجافا أي منهما أكثر تحديدًا، وبالتالي فإن خطأ الاستدعاء الطريقة غير واضحة.
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”. آمل أن يوضح هذا المقال أي شك لديك حول خطأ مترجم استدعاء الطريقة الغير واضحة في الجافا، يرجى التعليق إذا كنت ترغب في إضافة شيء ما أو إذا كان لديك بعض الارتباك بهذا.