Resolução de sobrecarga de método em java
Aqui está o que eu sei sobre a resolução de sobrecarga em java:
O processo do compilador tentando resolver a chamada do método a partir de definições de método sobrecarregadas é chamado resolução de sobrecarga. Se o compilador não conseguir encontrar a correspondência exata, ele procurará a correspondência mais próxima usando apenas upcasts (nunca são feitas downcasts).
Aqui está uma classe:
public class MyTest {
public static void main(String[] args) {
MyTest test = new MyTest();
Integer i = 9;
test.TestOverLoad(i);
}
void TestOverLoad(int a){
System.out.println(8);
}
void TestOverLoad(Object a){
System.out.println(10);
}
}
Como esperado, a saída é 10.
No entanto, se eu alterar ligeiramente a definição de classe e alterar o segundo método sobrecarregado.
public class MyTest {
public static void main(String[] args) {
MyTest test = new MyTest();
Integer i = 9;
test.TestOverLoad(i);
}
void TestOverLoad(int a){
System.out.println(8);
}
void TestOverLoad(String a){
System.out.println(10);
}
}
A saída é 8.
Aqui estou confuso. Se o downcasting nunca deveria ser usado, por que 8 foram impressos? Por que o compilador pegou oTestOverLoad
método que levaint
como um argumento que é um downcast deInteger
paraint
?