相关疑难解决方法(0)

为什么autoboxing会在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); }
}
Run Code Online (Sandbox Code Playgroud)

编译时,会导致以下错误:

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); }
                                  ^
Run Code Online (Sandbox Code Playgroud)

修复此错误很简单:只使用显式自动装箱:

static void m(int a, boolean b) { f((Object)a, b); }
Run Code Online (Sandbox Code Playgroud)

这正确地按预期正确调用第一个重载.

那么为什么重载决策失败了呢?为什么编译器没有自动包装第一个参数,并正常接受第二个参数?为什么我必须明确请求自动装箱?

java compiler-construction autoboxing overloading

34
推荐指数
2
解决办法
5869
查看次数