Наиболее конкретный метод с совпадениями как фиксированной/переменной артины (Varargs)
-
19-09-2019 - |
Вопрос
В Раздел 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.
Из 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) выбирается среди методов, которые применимы путем подтипирования.
(Мой акцент.)
Другие советы
Я не могу указать вам на спецификацию, но логически,
getSomething(String...args)
переводится на
getSomething(String[] args)
без двусмысленности