методы Java Varargs ведут себя по-разному - PullRequest
0 голосов
/ 28 января 2012

Учитывая код ниже:

public class Main {
    public static void main(String[] args) {
        new CC().ff(1);
    }
}

class CC {
    public static void ff(int cc) {
        System.out.println("bbbbb");
    }

    public static void ff(int... ints) {
        System.out.println("aaaaaaa");
    }
}

вывод будет:

aaaaaaa

bbbbb

Если я изменю третью строку на CC.ff(1), вывод будет:

bbbbb

Может кто-нибудь сказать мне, почему?

1 Ответ

2 голосов
/ 28 января 2012

Если я читаю то, что, по моему мнению, относится к соответствующему разделу JLS справа (это не совсем легкое чтение перед сном), поиск того, какой вызов метода вызывает, какой метод происходит в три фазы, которые выполняют поиск по следующим наборам методов в следующем порядке:

  1. Методы сопоставления арности, применимые подтипом
  2. Методы сопоставления арности, применимые преобразованием вызова метода
  3. Применимые методы переменной арности

В каждом из этих разделов упоминается, что, если на данном этапе обнаруживаются применимые методы, из них выбирается метод, который должен быть вызван. Только если фаза не дает применимых методов, поиск переходит к следующей фазе.

Так как методы переменной арности ищутся последними, это означает, что любой метод сопоставления, который не является переменной арностью, будет вызываться в предпочтении перед ними.

...