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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top