今日、自動ボクシングによってメソッドのオーバーロード解決が曖昧になることがあることに気付きました。最も単純な例は次のようです。
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); }
期待どおりに最初のオーバーロードを正しく呼び出します。
では、なぜオーバーロードの解決に失敗したのでしょうか? コンパイラが最初の引数を自動ボックス化せず、2 番目の引数を正常に受け入れなかったのはなぜですか? 自動ボクシングを明示的に要求する必要があったのはなぜですか?