为什么输出int?

时间:2014-03-16 10:55:22

标签: java overloading variadic-functions

为什么主方法没有调用第一种方法?

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

3 个答案:

答案 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-也是字节,字符,整数数据类型值。