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

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