logo

Metodo perkrova ir nulinė klaida Java

Java programoje labai dažnai perkrauti metodai. Žemiau yra įdomi Java programa. 

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

Išvestis:



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

Priežastis, kodėl aukščiau pateiktame scenarijuje gauname kompiliavimo laiko klaidą, yra tai, kad metodo argumentai „Integer“ ir „String“ nėra primityvūs „Java“ duomenų tipai. Tai reiškia, kad jie priima nulines reikšmes. Kai metodui1 perduodame nulinę reikšmę, kompiliatorius susipainioja, kurį metodą jis turi pasirinkti, nes abu priima nulį. Ši kompiliavimo laiko klaida neįvyks, nebent tyčia perduotume nulinę reikšmę. Pavyzdžiui, žiūrėkite toliau pateiktą scenarijų, kurio paprastai laikomės koduodami. 

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

Išvestis:

fun(Integer ) 

Pirmiau pateiktame scenarijuje, jei „arg“ reikšmė yra nulinė dėl išraiškos rezultato, tada nulinė reikšmė perduodama 1 metodui. Čia negautume kompiliavimo laiko klaidos, nes nurodome, kad argumentas yra sveikasis skaičius, todėl kompiliatorius pasirenka metodą1 (Sveikasis skaičius i) ir vykdys kodą jame. Pastaba: ši problema neišnyks, kai nepaisyti metodo argumentai yra primityvaus tipo duomenų. Nes kompiliatorius parinks tinkamiausią metodą ir jį įvykdys.