logo

Přetížení metody a chyba null v Javě

V Javě je velmi běžné přetěžování metod. Níže je zajímavý Java program. 

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

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í. 

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

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.