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