编译器错误选择Java中具有多个参数的重载方法的规则
我知道Java中的重载规则,但在某些情况下,我的直觉不起作用
让我们考虑一个例子:
public class Overloading {
public static void main(String[] args) {
long primitive = 3;
Long boxed = Long.valueOf(5);
doWork(primitive, boxed); //1
doWork(boxed, boxed); //2
doWork(primitive, primitive); //3
}
static void doWork(Long a, Long b) {}
static void doWork(long a, Long b) {}
}
您知道什么(1、2或3)将被成功编译吗
第一个和第二个会,但第三个不会(由于雄心勃勃的方法调用)
为什么javac
是这样设计的,并且不能解决这种情况?为什么不投3比1呢
# 1 楼答案
好问题
你建议将#3转换为#1似乎是有道理的,因为它少了一个自动装箱的任务
这可能是Java决定给您一个错误而不是选择包含最少装箱的方法的原因:
*索蒂里奥斯链接的accepted answer to the question让我们了解了为什么它可能太贵而不值
# 2 楼答案
正如您提到的,long可以自动装箱到long。 然而,这里有一个模棱两可的地方——如果第二个long是autoboxed,那么您将得到#1。如果它们都是自动装箱的,你会得到#2
因为Java无法决定您所指的方法,所以它会引发一个错误