Метод неоднозначный при перегрузке переменным аргументом

Я новичок в 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().