Наиболее конкретный метод с совпадениями как фиксированной/переменной артины (Varargs)

StackOverflow https://stackoverflow.com/questions/1321657

  •  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)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top