In Java è molto comune sovraccaricare i metodi. Di seguito è riportato un interessante programma Java.
una classe può estendere più classiJava
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); } }
Produzione :
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
Il motivo per cui riceviamo un errore in fase di compilazione nello scenario precedente è che qui gli argomenti del metodo Integer e String non sono entrambi tipi di dati primitivi in Java. Ciò significa che accettano valori nulli. Quando passiamo un valore nullo al metodo1 il compilatore si confonde su quale metodo deve selezionare poiché entrambi accettano il valore nullo. Questo errore in fase di compilazione non si verificherebbe a meno che non passassimo intenzionalmente un valore null. Ad esempio, vedere lo scenario seguente che seguiamo generalmente durante la codifica.
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); } }
Produzione :
fun(Integer )
Nello scenario precedente, se il valore "arg" è nullo a causa del risultato dell'espressione, il valore null viene passato al metodo1. Qui non otterremmo errori in fase di compilazione perché stiamo specificando che l'argomento è di tipo Integer quindi il compilatore seleziona il metodo1 (Integer i) ed eseguirà il codice al suo interno. Nota: questo problema non persiste quando gli argomenti del metodo sovrascritto sono di tipo dati primitivo. Perché il compilatore selezionerà il metodo più adatto e lo eseguirà.