logo

Преоптерећење метода и нулта грешка у Јави

У Јави је врло уобичајено да се методе преоптерећују. Испод је занимљив Јава програм. 

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

Излаз :

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

Разлог зашто добијамо грешку у времену компајлирања у горњем сценарију је овде аргументи метода Интегер и Стринг, оба нису примитивни типови података у Јави. То значи да прихватају нулте вредности. Када проследимо нулту вредност методи1, компајлер се збуни који метод мора да изабере пошто оба прихватају нулту вредност. Ова грешка у времену компајлирања се не би догодила осим ако намерно не проследимо нулту вредност. На пример, погледајте следећи сценарио који генерално пратимо током кодирања. 



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

Излаз :

fun(Integer ) 

У горњем сценарију, ако је вредност 'арг' нулл због резултата израза, онда се нулл вредност прослеђује методи1. Овде не бисмо добили грешку у времену компајлирања јер наводимо да је аргумент типа Интегер, па компајлер бира метод1(Интегер и) и извршиће код унутар њега. Напомена: Овај проблем не би постојао када су аргументи надјачане методе примитивни тип података. Зато што ће компајлер изабрати најпогоднији метод и извршити га.