logo

Menetelmän ylikuormitus ja nollavirhe Javassa

Javassa on hyvin yleistä ylikuormittaa menetelmiä. Alla on mielenkiintoinen Java-ohjelma. 

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

Lähtö:

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

Syy siihen, miksi saamme käännösaikavirheen yllä olevassa skenaariossa, on tässä menetelmäargumentit Integer ja String eivät kumpikaan ole primitiivisiä tietotyyppejä Javassa. Tämä tarkoittaa, että he hyväksyvät nolla-arvot. Kun välitämme nolla-arvon metodille 1, kääntäjä hämmentää, mikä menetelmä sen on valittava, koska molemmat hyväksyvät nollan. Tätä käännösaikavirhettä ei tapahdu, ellemme tarkoituksella välitä nolla-arvoa. Katso esimerkiksi alla oleva skenaario, jota noudatamme yleisesti koodattaessa. 



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

Lähtö:

fun(Integer ) 

Yllä olevassa skenaariossa, jos arg-arvo on nolla lausekkeen tuloksen vuoksi, nolla-arvo välitetään menetelmälle 1. Tässä emme saa käännösaikavirhettä, koska määritämme argumentin tyyppiä Kokonaisluku, joten kääntäjä valitsee metodin 1 (Kokonaisluku i) ja suorittaa siinä olevan koodin. Huomautus: Tämä ongelma ei jatku, kun ohitetut menetelmäargumentit ovat primitiivisiä tietotyyppejä. Koska kääntäjä valitsee sopivimman menetelmän ja suorittaa sen.