【发布时间】:2014-03-23 16:27:35
【问题描述】:
我尝试了解使用 java 编译器的重载规则。
这对我来说太难了。
public class Main {
public static void var(Long x) {
System.out.println("Long");
}
public static void var(int... x) {
System.out.println("int... x");
}
public static void main(String... args) {
var(5);
}
}
输出:
int...
在互联网上我找到了下一条规则:
- 原始扩展 > 拳击 > Varargs。
- 不允许加宽和装箱 (WB)。
- 允许装箱和加宽 (BW)。
- 重载时, Widening + vararg 和 Boxing + vararg 只能以互斥方式使用,即不能一起使用。
- 不允许在包装类之间进行扩展
但我无法将此规则应用于此代码行为。
你能帮帮我吗?
我的错误版本:
拳击int -> Integer 并扩大到Long
其他问题
public class Main {
public static void var(Object x) {
System.out.println("Object");
}
public static void var(int... x) {
System.out.println("int... x");
}
public static void main(String... args) {
var(5);
}
}
输出:
object
【问题讨论】:
-
嗯,答案就在问题中:不允许加宽和装箱 (WB)。要调用采用 Long 的方法,必须将 int 5 扩大为 long,然后将其装箱为 Long。这是不允许的。
-
boxing int -> 整数并扩大到 Long
-
允许装箱和加宽 (BW)。
-
不允许在包装类之间扩展。反正规则极其复杂,真相的来源就是JSL。
-
对我来说对应jls的一部分超级特别复杂
标签: java overloading