在Java中选择具有多个参数的重载方法的规则

时间:2013-09-12 15:13:28

标签: java compiler-errors overloading primitive-types autoboxing

我知道在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 个答案:

答案 0 :(得分:2)

好问题!

你建议将#3强制转换为#1似乎有意义,因为它可以减少一次自动装箱。

这可能是Java决定给你一个错误的原因,而不是选择涉及最少拳击的方法:

  1. 这种情况罕见
  2. 找出用于自动装箱的方法可能昂贵 *。
  3. 选择哪种方法背后的逻辑主观
  4. 因此,在这种情况下,Java会强迫您不要含糊不清
  5. *由Sotirios链接的accepted answer to the question可以让您深入了解为什么价格太贵而无法获得价值。

答案 1 :(得分:0)

  

第一个和第二个将,但第三个将不会(由于方法调用方法)。为什么java不能   解决这种情况?为什么不将#3投射到#1?

正如你所提到的,long可以自动装箱到Long。 但是,这里有一个含糊不清的地方 - 如果只有第二个长的是自动编码,那么你会得到#1。如果它们都是自动装箱的,你就会得到#2。

由于Java无法确定您的方法,因此会引发错误。