logo

التحميل الزائد للأسلوب والخطأ الفارغ في Java

من الشائع جدًا في Java استخدام أساليب التحميل الزائد. يوجد أدناه برنامج Java مثير للاهتمام. 

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();  // 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. وهذا يعني أنهم يقبلون القيم الخالية. عندما نمرر قيمة فارغة إلى الطريقة 1، يرتبك المترجم بشأن الطريقة التي يجب عليه تحديدها، حيث أن كلاهما يقبل القيمة الخالية. لن يحدث خطأ وقت الترجمة هذا إلا إذا قمنا بتمرير قيمة فارغة عن عمد. على سبيل المثال، راجع السيناريو أدناه الذي نتبعه بشكل عام أثناء البرمجة. 



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" فارغة بسبب نتيجة التعبير، فسيتم تمرير القيمة الخالية إلى الطريقة 1. لن نحصل هنا على خطأ في وقت الترجمة لأننا نحدد أن الوسيطة من النوع Integer ومن ثم يختار المترجم الطريقة 1 (Integer i) وسيقوم بتنفيذ التعليمات البرمجية الموجودة داخل ذلك. ملاحظة: لن تستمر هذه المشكلة عندما تكون وسيطات الطريقة التي تم تجاوزها من نوع البيانات البدائية. لأن المترجم سيختار الطريقة الأنسب وينفذها.