El método más específico con coincidencias de aridad fija/variable (varargs)
-
19-09-2019 - |
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?
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