Javassa on hyvin yleistä ylikuormittaa menetelmiä. Alla on mielenkiintoinen Java-ohjelma.
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(); // 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.