logo

Overbelasting van methode en nulfout in Java

In Java is het heel gebruikelijk om methoden te overbelasten. Hieronder staat een interessant Java-programma. 

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

Uitgang:



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

De reden waarom we in het bovenstaande scenario een compileerfout krijgen, is dat de methode-argumenten Integer en String beide geen primitieve gegevenstypen zijn in Java. Dat betekent dat ze nulwaarden accepteren. Wanneer we een nulwaarde doorgeven aan method1, raakt de compiler in de war welke methode hij moet selecteren, omdat beide de nul accepteren. Deze compileerfout zou niet optreden tenzij we opzettelijk een null-waarde doorgeven. Zie bijvoorbeeld het onderstaande scenario dat we in het algemeen volgen tijdens het coderen. 

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

Uitgang:

fun(Integer ) 

Als in het bovenstaande scenario de waarde 'arg' nul is vanwege het resultaat van de expressie, wordt de nulwaarde doorgegeven aan methode1. Hier krijgen we geen compileerfout omdat we specificeren dat het argument van het type Integer is. Daarom selecteert de compiler de methode1 (Integer i) en zal de code daarin uitvoeren. Opmerking: dit probleem blijft niet bestaan ​​als de overschreven methodeargumenten een primitief gegevenstype zijn. Omdat de compiler de meest geschikte methode selecteert en deze uitvoert.