Наиболее конкретный метод с совпадениями как фиксированной / переменной арности (varargs) - PullRequest
4 голосов
/ 24 августа 2009

В разделе 15.12.2.5 спецификации языка Java говорится о том, как выбрать наиболее специфический метод в обоих случаях: методы с фиксированной арностью и методы с переменной арностью (т. Е. * 1004). *).

Что я не могу найти в 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 ]

10 голосов
/ 24 августа 2009

На первом этапе разрешения метода рассматриваются только методы с фиксированной арностью, и процесс завершается, если найдено совпадение, перед тем, как рассматриваются какие-либо методы varargs.

С http://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.12.2.2

15.12.2.2 Фаза 1: Определить Соответствующая арность Методы, применимые к Подтипы

Если метод подтипа не применяется найден, поиск применим методы продолжается с этапа 2 (§15.12.2.3). В противном случае наиболее конкретный метод (§15.12.2.5) выбран среди методов, которые применимы по подтипам.

(Мой акцент.)

0 голосов
/ 24 августа 2009

Я не могу указать вам спецификацию, но логически,

getSomething(String...args) 

переводится как

getSomething(String[] args)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...