Наиболее специфический метод с совпадениями как фиксированной / переменной арности (varargs)
В разделе 15.12.2.5 Спецификации языка Java говорится о том, как выбрать наиболее конкретный метод в обоих случаях: методы с фиксированной арностью и методы с переменной арностью (т.е. varargs
).
Чего я не могу найти в JLS, так это о выборе между двумя методами, где один имеет фиксированную арность, а другой - переменную арность. Например:
public interface SomeApi {
public String getSomething(String arg); // method 1
public String getSomething(String ... args); // method 2
}
Компилируется просто отлично, как и следовало ожидать (по причинам, изложенным Йони ниже). Этот код вызова также компилируется:
SomeApi api = ...
Object o = api.getSomething("Hello");
и если вы запустите его, method #1
(то есть метод не Varargs) вызывается. Почему этот код вызова не является двусмысленным? Почему метод фиксированной арности более специфичен, чем метод переменной арности? Может кто-нибудь указать мне на соответствующую часть спецификации?
2 ответа
На первом этапе разрешения метода рассматриваются только методы с фиксированной арностью, и процесс завершается, если найдено совпадение, перед рассмотрением любых методов varargs.
С http://docs.oracle.com/javase/specs/jls/se6/html/expressions.html
15.12.2.2 Фаза 1: Определить методы согласования арности, применимые подтипом
Если не найдено никакого метода, применимого подтипом, поиск применимых методов продолжается с фазы 2 (§15.12.2.3). В противном случае, наиболее конкретный метод (§15.12.2.5) выбирается среди методов, которые применимы с помощью подтипов.
(Мой акцент.)
Я не могу указать вам на спецификацию, но логично,
getSomething(String...args)
переводит на
getSomething(String[] args)
без двусмысленности