为什么主方法没有调用第一种方法?
public class Test {
public static void printValue(byte...b) {
System.out.println("long");
}
public static void printValue(int i, int j, int k) {
System.out.println("int");
}
public static void main(String... args) {
byte b = 9;
printValue(b,b,b);
}
}
为什么输出int
?
答案 0 :(得分:5)
在选择最合适的方法时,编译器首先选择拓宽,然后 Boxing ,最后,如果全部失败, Var-args 。在您的情况下,它会将所有bytes
扩展到ints
以获得匹配方法,并使用3个int
类型参数。
有关详细信息,请参阅JLS §15.12.2。
答案 1 :(得分:1)
换句话说,您已经重载了printValue
方法。现在,在调用printValue(b,b,b);
时,编译器找不到printValue
签名,该签名将byte
作为参数类型并且有3个参数,但它可以发现printValue
有一个重载需要3个参数但接受int
类型,byte
可以隐式投放到int
。
所以最终调用方法重载printValue(int i, int j, int k)
答案 2 :(得分:1)
在调用方法编译器时,首先检查方法名称,参数列表与数据类型完全匹配,如方法重载。
如果编译器没有得到方法的完全匹配,它会寻找最佳匹配。在你的情况下,它首先检查具有三个参数的方法printValue()。
它选择public static void printValue(int i,int j,int k)方法,因为 -
-compiler没有得到确切的匹配方法。
-it寻找合适的匹配,例如byte-> int,char - > int,int-> long可以显式地完成。(加宽)或自动装箱。**较小的数据类型可以转换为更大的数据类型值。所以它调用printValue(int i,int j,int k)。** - 您传递的值可以很容易地转换为整数。 9-也是字节,字符,整数数据类型值。