Когда вы сами приводите первый аргумент к Object, компилятор сопоставляет метод без использования автобоксирования (JLS3 15.12.2):
Первый этап (§15.12.2.2) выполняет
разрешение перегрузки без разрешения
бокс или распаковка конверсии, или
использование метода переменной арности
призывание. Если нет применимого метода
найден на этом этапе, то
обработка продолжается до второго
фазы.
Если вы не приведете его явно, он перейдет ко второй фазе попытки найти подходящий метод, разрешающий автобокс, и тогда он действительно будет неоднозначным, потому что ваш второй аргумент может быть сопоставлен с логическим или Object.
Второй этап (§15.12.2.3) выполняет
разрешение перегрузки при разрешении
бокс и распаковка, но все же
исключает использование переменной арности
вызов метода.
Почему на втором этапе компилятор не выбирает второй метод, потому что не требуется автобокс логического аргумента? Поскольку после того, как он обнаружил два метода сопоставления, используется только преобразование подтипа, чтобы определить наиболее специфический метод из двух, независимо от того, какой бокс или распаковка имели место, чтобы соответствовать им в первую очередь (§15.12.2.5).
Кроме того: компилятор не всегда может выбрать наиболее конкретный метод, исходя из необходимого количества автоматических (не) упаковок. Это все еще может привести к неоднозначным случаям. Например, это все еще неоднозначно:
public class Test {
static void f(Object a, boolean b) {}
static void f(int a, Object b) {}
static void m(int a, boolean b) { f(a, b); } // ambiguous
}
Помните, что алгоритм выбора метода сопоставления (шаг 2 времени компиляции) исправлен и описан в JLS. На втором этапе выборочная автобокс или распаковка отсутствует. Компилятор найдет все методы, которые доступны (оба метода в этих случаях) и применимы (опять же, два метода), и только затем выбирает наиболее конкретный, не глядя на бокс / распаковку, что неоднозначно здесь.