Em Java é muito comum sobrecarregar métodos. Abaixo está um programa Java interessante.
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); } }
Saída :
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
A razão pela qual obtemos um erro de tempo de compilação no cenário acima é que aqui os argumentos do método Integer e String não são tipos de dados primitivos em Java. Isso significa que eles aceitam valores nulos. Quando passamos um valor nulo para o método1, o compilador fica confuso sobre qual método deve selecionar, pois ambos estão aceitando o nulo. Este erro de tempo de compilação não aconteceria a menos que passássemos intencionalmente o valor nulo. Por exemplo, veja o cenário abaixo que geralmente seguimos durante a codificação.
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); } }
Saída :
fun(Integer )
No cenário acima, se o valor 'arg' for nulo devido ao resultado da expressão, o valor nulo será passado para o método1. Aqui não obteríamos erro de tempo de compilação porque estamos especificando que o argumento é do tipo Integer, portanto, o compilador seleciona o método1 (Integer i) e executará o código dentro dele. Nota: Este problema não persistiria quando os argumentos do método substituído fossem do tipo de dados primitivo. Porque o compilador selecionará o método mais adequado e o executará.