Java programoje labai dažnai perkrauti metodai. Žemiau yra įdomi Java programa.
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); } }
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.
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(); 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.