После прочтения JLS несколько раз, я, наконец, думаю, что понимаю этот раздел.
То, что они говорят, это то, что если есть два метода переменной арности, для целей определения, который является «более конкретным», вы можете считать, что метод с более коротким списком аргументов будет расширен, чтобыдлина равна более длинной.например,
int compute(Object o1, Object o2, Object... others)
int compute(String s1, Object... others)
можно считать (только для целей "более конкретной") эквивалентным
int compute(Object o1, Object o2, Object... others)
int compute(String s1, Object, Object... others)
, а затем типы аргументов сравниваются один за другим споследний метод более конкретен.
(более строго, первый имеет n = 3, k = 2, n> = k, с String <: Object [String является подтипом Object] и JLSдиктует сравнение типов непосредственно каждого параметра для j от 1 до k-1 [на один меньше, чем более короткая длина], сравнение типа vararg более короткой сигнатуры метода с остальными параметрами более длинного метода.) </p>
В следующем случае:
int compute(Object o1, Object o2, String... strings)
int compute(Object o1, String... strings)
они будут эквивалентны (только для целей "более конкретно")
int compute(Object o1, Object o2, String... strings)
int compute(Object o1, String, String... strings)
, а последний более конкретен.
Таким образом, переменная арность никогда не превосходит подтипы для сравнения «более специфических» методов, которые оба имеют переменную арность.
Однако методы с фиксированной арностью всегда рассматриваются первыми (JLS 15.12.2.2 и 15.12.2.3) перед методами переменной арности.