Перевантаження методів і нульова помилка в 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, отже, компілятор вибирає method1(Integer i) і виконає код у ньому. Примітка. Ця проблема не виникне, якщо перевизначені аргументи методу є примітивним типом даних. Тому що компілятор вибере найбільш підходящий метод і виконає його.