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