今天我注意到自动装箱有时会导致方法重载解析中的歧义。最简单的例子似乎是这样的:
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); }
它按预期正确调用了第一个重载。
那么为什么重载解析会失败呢?为什么编译器不自动装箱第一个参数并正常接受第二个参数?为什么我必须明确请求自动装箱?