Até o momento, todas as regras para quando um método sobrecarregado é chamado devem ser lógicas. Chamadas Java o método mais específico possível. Quando alguns dos tipos interagem, as regras Java focam na compatibilidade com versões anteriores. No Java 1.4 e versões anteriores, autoboxing e varargs não existiam. Embora isso tenha ocorrido há muito tempo, o código antigo ainda precisa funcionar - o que significa autoboxing e varargs vêm por último quando Java analisa métodos sobrecarregados. Pronto para o pedido oficial? A Tabela 4.4 apresenta para você.
Vamos fazer isso de forma prática, usando as regras da Tabela 4.4. O que você acha dessas saídas?
public class Glider2 {
public static String glide(String s) {
return "1";
}
public static String glide(String... s) {
return "2";
}
public static String glide(Object o) {
return "3";
}
public static String glide(String s, String t) {
return "4";
}
public static void main(String[] args) {
System.out.print(glide("a"));
System.out.print(glide("a", "b"));
System.out.print(glide("a", "b", "c"));
} }
Imprime 142 . A primeira chamada corresponde à assinatura que recebe uma única String porque essa é a correspondência mais específica. A segunda chamada corresponde à assinatura, tendo duas String parâmetros, pois essa é uma correspondência exata. Não é até a terceira chamada que a versão varargs é usado, pois não há correspondências melhores.
Por mais complacente que seja o Java na tentativa de encontrar uma correspondência, ele fará apenas uma conversão:
public class TooManyConversions {
public static void play(Long l) { }
public static void play(Long... l) { }
public static void main(String[] args) {
play(4); // DOES NOT COMPILE
play(4L); // calls the Long version
} }
Aqui temos um problema. Java tem o prazer de converter o int 4 em um longo 4 ou um inteiro 4. Ele não consegue lidar com a conversão em duas etapas para um longo e depois para um longo . Se tivéssemos público jogo nulo estático (Objeto o) {} , corresponderia porque apenas uma conversão seria necessário: de int para Inteiro . Um número inteiro é um objeto , como você verá no capítulo 5.