Pregunta

En Sección 15.12.2.5 de la especificación del idioma Java, habla sobre cómo elegir el método más específico en ambos casos de métodos con aridad fija y métodos de aridad variable (es decir, varargs).

Lo que no puedo encontrar en el JLS es algo sobre decidir entre dos métodos donde uno es de aridad fija y una de aridad variable sin embargo. Por ejemplo:

public interface SomeApi {
    public String getSomething(String arg);       // method 1
    public String getSomething(String ... args);  // method 2
}

Se compila bien como esperaría (por razones descritas por Yoni a continuación). Este código de llamada también compila:

SomeApi api = ...
Object o = api.getSomething("Hello");

Y si lo ejecutas, method #1 (es decir, se llama al método no varargs). ¿Por qué este código de llamadas no es ambiguo? ¿Por qué el método de aridad fijo es más específico que el de la aridad variable? ¿Alguien puede señalarme la parte relevante de las especificaciones?

¿Fue útil?

Solución

La fase de resolución del primer método considera solo métodos de aridad fijos y el proceso termina si se encuentra una coincidencia, antes de considerar cualquier método de varargs.

De http://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.12.2

15.12.2.2 Fase 1: Identificar Aridad a juego Métodos aplicables por subtitán

Si no se encuentra ningún método aplicable por subtife, la búsqueda de métodos aplicables continúa con la fase 2 (§15.12.2.3). De lo contrario, el método más específico (§15.12.2.5) se elige entre los métodos que son aplicables por subtipo.

(Mi énfasis).

Otros consejos

No puedo señalarte la especificación, pero lógicamente,

getSomething(String...args) 

se traduce en

getSomething(String[] args)

sin ambigüedad

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top