Вот что я знаю о разрешении перегрузки в java:
Процесс компилятора, пытающегося разрешить вызов метода из заданного перегруженные определения методов называются разрешением перегрузки. Если компилятор не может найти точное совпадение, он ищет ближайшее совпадение используя только
upcasts
(downcasts никогда не выполняются).
Вот класс:
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);
}
}
Как и ожидалось, выход равен 10.
Однако, если я немного изменил определение класса и изменил второй перегруженный метод.
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);
}
}
Выход: 8.
Здесь я смущен. Если downcasting
никогда не использовалось, то почему 8 печатались вообще? Почему компилятор взял метод TestOverLoad
, который принимает int как аргумент, который является downcast от Integer к int?