【发布时间】:2021-11-29 13:37:40
【问题描述】:
我今天注意到自动装箱有时会导致方法重载解决方案的歧义。最简单的例子似乎是这样的:
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); }
按预期正确调用第一个重载。
那么为什么重载解析失败了?为什么编译器不自动装箱第一个参数,并正常接受第二个参数?为什么我必须明确请求自动装箱?
【问题讨论】:
标签: java compiler-construction overloading autoboxing