Método mais específico com correspondências de aridade fixa/variável (varargs)
-
19-09-2019 - |
Pergunta
Em seção 15.12.2.5 da Especificação da Linguagem Java, fala sobre como escolher o método mais específico em ambos os casos de métodos com aridade fixa e métodos de aridade variável (ou seja, varargs
).
O que não consigo encontrar no JLS é decidir entre dois métodos onde um é de aridade fixa e outro de aridade variável no entanto.Por exemplo:
public interface SomeApi {
public String getSomething(String arg); // method 1
public String getSomething(String ... args); // method 2
}
Compila muito bem como seria de esperar (pelas razões descritas por Yoni abaixo).Este código de chamada também compila:
SomeApi api = ...
Object o = api.getSomething("Hello");
e se você executá-lo, method #1
(ou seja,o método não-varargs) é chamado.Por que esse código de chamada não é ambíguo?Por que o método de aridade fixa é mais específico do que o de aridade variável?Alguém pode me indicar a parte relevante da especificação?
Solução
A primeira fase de resolução do método considera apenas métodos de aridade fixa e o processo é encerrado se uma correspondência for encontrada, antes que qualquer método varargs seja considerado.
De http://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.12.2.2
15.12.2.2 Fase 1:Identificar Aridade correspondente Métodos aplicáveis subtipando
Se não for aplicável qualquer método por subtipo é encontrado, a pesquisa para aplicável métodos continua com a fase 2 (§15.12.2.3). Caso contrário, o método mais específico (§15.12.2.5) é escolhido entre os métodos aplicáveis pela subtipagem.
(Minha ênfase.)
Outras dicas
Eu não posso apontar você para as especificações, mas logicamente,
getSomething(String...args)
traduz para
getSomething(String[] args)
sem ambiguidade