Разрешение перегрузки метода в Java

Вот что я знаю о разрешении перегрузки в Java:

Процесс компилятора, пытающийся разрешить вызов метода из заданных перегруженных определений методов, называется разрешением перегрузки. Если компилятор не может найти точное совпадение, он ищет наиболее близкое совпадение, используя только upcasts (никогда не выполняются downcast).

Вот класс:

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.

Здесь я в замешательстве. Если даункатинг никогда не использовался, тогда зачем вообще печатать 8? Почему компилятор взялTestOverLoad метод, который принимаетint в качестве аргумента, который является удрученным отInteger вint?

Ответы на вопрос(5)

Ваш ответ на вопрос