Метод неоднозначный при перегрузке переменным аргументом
Я новичок в Java. Сегодня я увидел фрагмент кода в "Мышление в Java", но я не могу понять, почему он создает ошибку времени компиляции.
код:
public class OverloadingVarargs2 {
static void f(float i, Character... args) {
System.out.println("first");
}
static void f(Character... args) {
System.out.println("second");
}
public static void main(String[] args) {
f(1, 'a');
f('a', 'b');
}
}
Скомпилировать жалобу:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method f(float, Character[]) is ambiguous for the type OverloadingVarargs2
Ответы
Ответ 1
Проблема заключается в f('a', 'b');
Оба метода имеют аргумент vararg, что означает, что оба они будут рассмотрены на третьей и последней фазе перегрузки разрешения.
'a'
- это char
, который можно автоматически преобразовать в float
через Расширение примитивного преобразования.
Оба 'a'
и 'b'
могут быть преобразованы из char
в Character
с помощью Бокс Conversion.
Поэтому оба аргумента f(float i, Character... args)
и f(Character... args)
применимы для аргументов 'a'
и 'b'
, и ни один из них не имеет приоритета над другим.
Ответ 2
Оператор f('a', 'b');
неоднозначен, поскольку компилятор не может вывести, какой именно метод вызывать.
Причиной этого является то, что примитивный тип char
считается числовым (для каждого символа существует соответствующее неотрицательное целочисленное значение от 0 до 65535).
Вот почему компилятор не может вывести, если параметр 'a'
обозначает целочисленное значение 97
, которое затем следует отличать до float
или 'a'
означает символ 'a'
, который должен быть тогда autoboxed до Character
.
Ответ 3
это вызывает проблемы, потому что
f('a', 'b');
'a'
может быть преобразован в int и, следовательно, передан в float в первом f()
.