3

我知道 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?

4

2 回答 2

2

好问题!

您建议将 #3 强制转换为 #1 似乎是有道理的,因为它要做的自动装箱少了一个。

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

  1. 这种情况很少见
  2. 弄清楚使用哪种方法进行自动装箱可能会很昂贵*。
  3. 选择哪种方法背后的逻辑可能过于主观
  4. 因此,在这种情况下,Java 迫使您不要模棱两可

* Sotirios 所链接的问题的公认答案提供了一些关于为什么它可能过于昂贵而不值得的见解。

于 2013-09-12T15:22:18.233 回答
0

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

正如您所提到的,long 可以自动装箱为 Long。然而,这里有一个歧义——如果只有第二个 long 被自动装箱,你会得到 #1。如果它们都被自动装箱,你会得到#2。

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

于 2013-09-12T15:21:37.950 回答