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?

questionAnswers(5)

yourAnswerToTheQuestion