As primitivas funcionam de maneira semelhante às variáveis de referência. Java tenta encontrar os mais específicos método sobrecarregado correspondente. O que você acha que acontece aqui?
public class Plane { public void fly(int i) { System.out.print("int "); } public void fly(long l) { System.out.print("long "); } public static void main(String[] args) { Plane p = new Plane(); p.fly(123); p.fly(123L); } }A resposta é longa . A primeira chamada passa um int e vê uma correspondência exata. O segundoA segunda chamada é longa e também vê uma correspondência exata. Se comentarmos a sobrecarga Com a lista de parâmetros int , a saída se torna longa . Java não tem problema chamando um primitivo maior. No entanto, isso não será feito, a menos que uma correspondência melhor não seja encontrada.
Observe que Java pode aceitar apenas tipos mais amplos. Um int pode ser passado para um método que leva um parâmetro longo . Java não será convertido automaticamente para um tipo mais restrito. Se você quer passar um longo a um método de tomar um int parâmetro, você tem que adicionar um elenco de dizer explicitamente narremar está bem.