有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

编译器错误选择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呢


共 (2) 个答案

  1. # 1 楼答案

    好问题

    你建议将#3转换为#1似乎是有道理的,因为它少了一个自动装箱的任务

    这可能是Java决定给您一个错误而不是选择包含最少装箱的方法的原因:

    1. 这种情况很少见
    2. 找出用于自动装箱的方法可能非常昂贵
    3. 选择哪种方法背后的逻辑可能过于主观
    4. 因此,在本例中,Java强制您不要含糊不清

    *索蒂里奥斯链接的accepted answer to the question让我们了解了为什么它可能太贵而不值

  2. # 2 楼答案

    The first and the second will, but third won't (due to ambidous method call). Why java can't resolve this situation? Why not to cast #3 to #1?

    正如您提到的,long可以自动装箱到long。 然而,这里有一个模棱两可的地方——如果第二个long是autoboxed,那么您将得到#1。如果它们都是自动装箱的,你会得到#2

    因为Java无法决定您所指的方法,所以它会引发一个错误