java中的方法规则重载解释
我试图理解使用java编译器的重载规则 这对我来说太难了java中的方法规则重载解释,java,overloading,Java,Overloading,我试图理解使用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(Strin
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...
object
在互联网上,我发现了下一条规则:
int
->Integer
并扩大到Long
补充问题
输出:
int...
object
装箱int
到Integer
并加宽到Long
虽然
int
toInteger
装箱可以,但是Integer
toLong
不是有效的加宽Long
不是整数的超类型。所以这是无效的。一个选项是加宽,然后是装箱。但是这种转换在Java中是不允许的。所以剩下的唯一选择就是使用varargs。好吧,答案是:不允许加宽和装箱(WB)。要调用耗时很长的方法,必须将int 5加宽为Long,然后装箱为Long。这是不允许的。允许装箱int->Integer并加宽到LongBoxing和加宽(BW)。不允许在包装类之间加宽。无论如何,规则是非常复杂的,而真相的来源是JSL。对我来说,jls super extra Extract Complexity的一部分我注意到了另一个奇怪的行为。你能解释一下吗?(在主题中添加)@gstackoverflow,即装箱后加宽<代码>整数
到对象
是一个有效的加宽区域。装箱+加宽-第三个,但varargs-在第一个step@gstackoverflow只要记住一件事,方法重载->varargs
排在最后。编译器总是首先尝试精确匹配,然后加宽,然后装箱,然后装箱,然后加宽,然后变参数。JLS中有规则。是否存在vararg+加宽和vararg+装箱