Я просто написал код со следующей структурой:Почему это не вызывает двусмысленности?
public void method(int x) {
//...
}
public void method(int x, String... things) {
//...
}
Я был очень удивлен, что это компилируется, и что если я вызван
method(3);
то выбрал бы первый. Очевидно, что в некотором смысле это естественный выбор, но если первый метод не существует, это было бы разумным способом вызова второго (с пустым массивом varargs). Так что, конечно, это должно считаться неоднозначным и производить ошибку времени компиляции?
Или это рассматривается как частный случай?
Кажется неправильным рассматривать его как таковое, потому что это означает, что добавление нового метода может сломать существующий код, и это не очень счастливое состояние дел.
(Совершенство только знает, какой из них вы бы в конечном итоге вызова, если первый один был добавлен в качестве нового метода подкласса, содержащего второй ...)
Вы вызвали метод с 1 параметром, почему он должен назвать тот, у кого 2 необходимо? – loli
@loli, потому что нет ни одного с двумя необходимыми. Вторая имеет параметр varargs, что означает, что часть 'String ...' может принимать любое количество аргументов, включая ноль. –
@ chiastic-security А я не знал, что это эквивалент Java, я думал, что вы написали ... потому что вам было слишком лениво найти [] на клавиатуре – loli