Сегодня я заметил, что автоматическое боксирование иногда может вызывать неоднозначность в разрешении перегрузки метода. Простейший пример выглядит следующим образом:
public class Test {
static void f(Object a, boolean b) {}
static void f(Object a, Object b) {}
static void m(int a, boolean b) { f(a,b); }
}
При компиляции он вызывает следующую ошибку:
Test.java:5: reference to f is ambiguous, both method
f(java.lang.Object,boolean) in Test and method
f(java.lang.Object,java.lang.Object) in Test match
static void m(int a, boolean b) { f(a, b); }
^
Исправление этой ошибки тривиально: просто используйте явное автоматическое боксирование:
static void m(int a, boolean b) { f((Object)a, b); }
Что правильно вызывает первую перегрузку, как ожидалось.
Итак, почему разрешение перегрузки не получилось? Почему компилятор не установил первый аргумент и не принял второй аргумент? Почему я должен явно запросить авто-бокс?