Risoluzione del sovraccarico del metodo in java

Ecco cosa so della risoluzione di sovraccarico in java:


Il processo del compilatore che tenta di risolvere la chiamata del metodo da determinate definizioni di metodo sovraccarico viene chiamato risoluzione di sovraccarico. Se il compilatore non riesce a trovare la corrispondenza esatta, cerca la corrispondenza più vicina usando solo gli upcasts (i downcast non vengono mai eseguiti).


Ecco una class:

 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); } } 

Come previsto, l’output è 10.

Tuttavia se cambio leggermente la definizione della class e cambio il secondo metodo sovraccarico.

  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); } } 

L’output è 8.

Qui sono confuso. Se il downcasting non è mai stato usato, allora perché è stato stampato 8? Perché il compilatore ha raccolto il metodo TestOverLoad che accetta int come argomento che è un downcast da Integer a int?