V Javě je velmi běžné přetěžování metod. Níže je zajímavý Java program.
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); } }
výstup:
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
Důvodem, proč ve výše uvedeném scénáři dostáváme chybu času kompilace, jsou argumenty metody Integer a String, oba nejsou primitivní datové typy v Javě. To znamená, že přijímají nulové hodnoty. Když předáme hodnotu null metodě1, kompilátor je zmatený, kterou metodu má vybrat, protože obě přijímají hodnotu null. K této chybě v době kompilace nedojde, pokud záměrně nepředáme hodnotu null. Podívejte se například na níže uvedený scénář, kterým se obecně řídíme při kódování.
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); } }
výstup:
fun(Integer )
Pokud je ve výše uvedeném scénáři hodnota 'arg' nulová kvůli výsledku výrazu, pak je nulová hodnota předána metodě1. Zde bychom nedostali chybu doby kompilace, protože zadáváme, že argument je typu Integer, takže kompilátor vybere metodu1 (Integer i) a spustí kód uvnitř. Poznámka: Tento problém nebude přetrvávat, pokud jsou argumenty přepsané metody primitivního datového typu. Protože kompilátor vybere nejvhodnější metodu a provede ji.