我知道在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?
答案 0 :(得分:2)
好问题!
你建议将#3强制转换为#1似乎有意义,因为它可以减少一次自动装箱。
这可能是Java决定给你一个错误的原因,而不是选择涉及最少拳击的方法:
*由Sotirios链接的accepted answer to the question可以让您深入了解为什么价格太贵而无法获得价值。
答案 1 :(得分:0)
第一个和第二个将,但第三个将不会(由于方法调用方法)。为什么java不能 解决这种情况?为什么不将#3投射到#1?
正如你所提到的,long可以自动装箱到Long。 但是,这里有一个含糊不清的地方 - 如果只有第二个长的是自动编码,那么你会得到#1。如果它们都是自动装箱的,你就会得到#2。
由于Java无法确定您的方法,因此会引发错误。