Przeciążenie metody i błąd zerowy w Javie

W Javie bardzo powszechne jest przeciążanie metod. Poniżej znajduje się ciekawy program 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  );      }   }   

Wyjście :

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 

Powodem, dla którego w powyższym scenariuszu pojawia się błąd kompilacji, jest to, że argumenty metody Integer i String nie są prymitywnymi typami danych w Javie. Oznacza to, że akceptują wartości null. Kiedy przekazujemy wartość null do metody 1, kompilator nie jest pewien, którą metodę musi wybrać, ponieważ obie akceptują wartość null. Ten błąd kompilacji nie wystąpiłby, gdyby celowo nie przekazaliśmy wartości null. Zobacz na przykład poniższy scenariusz, który zazwyczaj stosujemy podczas kodowania. 

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  );      }   }   

Wyjście :

fun(Integer )  

W powyższym scenariuszu, jeśli wartość „arg” ma wartość null ze względu na wynik wyrażenia, wartość null jest przekazywana do metody 1. Tutaj nie otrzymalibyśmy błędu czasu kompilacji, ponieważ określamy, że argument jest typu Integer, dlatego kompilator wybiera metodę 1 (Integer i) i wykona znajdujący się w niej kod. Uwaga: ten problem nie będzie się powtarzał, jeśli zastąpione argumenty metody będą miały pierwotny typ danych. Ponieważ kompilator wybierze najbardziej odpowiednią metodę i wykona ją.