Наиболее специфический метод с совпадениями как фиксированной / переменной арности (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)

без двусмысленности

Другие вопросы по тегам