Наиболее специфический метод с совпадениями как фиксированной/переменной arity (varargs)
В раздел 15.12.2.5 Спецификации языка Java, в нем говорится о том, как выбрать наиболее конкретный метод в обоих случаях методов с фиксированная арность и методы переменной arity (т.е. varargs
).
То, что я не могу найти в JLS, - это что-то о том, чтобы решить два метода, когда один из них имеет фиксированную arity и один из переменных arity. Например:
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). Почему этот код не является двусмысленным? Почему метод фиксированной arity более конкретный, чем переменная? Может ли кто-нибудь указать мне на соответствующий бит спецификации?
Ответы
Ответ 1
Первая фаза разрешения метода рассматривает только фиксированные методы arity, и процесс завершается, если совпадение найдено до того, как будут рассмотрены любые методы varargs.
От http://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.12.2.2
15.12.2.2 Фаза 1: Определение Соответствие Arity. Способы, применимые Подтипирование
Если какой-либо метод, применяемый подтипами найдено, поиск применимых методы продолжаются с фазой 2 (§15.12.2.3). В противном случае наиболее выбран конкретный метод (§15.12.2.5) среди применяемых методов путем подтипирования.
(Мой акцент.)
Ответ 2
Я не могу указать вам спецификацию, но логически,
getSomething(String...args)
переводится на
getSomething(String[] args)
без двусмысленности