使用基元及其包装器重载的方法

我正在尝试制定下面方案中使用的规则。 请解释为什么我得到2个不同的输出。

场景1输出: 我是一个对象。

class Test { public static void main (String[] args) { Test t = new Test(); byte b_var = 10; t.do_the_test(b_var); } public void do_the_test(Character c) { System.out.println("I am a character."); } public void do_the_test(Integer i) { System.out.println("I am an integer."); } public void do_the_test(Object obj) { System.out.println("I am an object."); } } 

场景2输出: 我是一个整数。

 class Test { public static void main (String[] args) { Test t = new Test(); byte b_var = 10; t.do_the_test(b_var); } public void do_the_test(char c) { System.out.println("I am a character."); } public void do_the_test(int i) { System.out.println("I am an integer."); } public void do_the_test(Object obj) { System.out.println("I am an object."); } } 

Java语言规范说明了方法签名解析:

第一阶段(§15.12.2.2)执行重载解析而不允许装箱或拆箱转换,或使用变量arity方法调用。 如果在此阶段没有找到适用的方法,则处理继续到第二阶段。

在第二种情况下,涉及int的方法签名适用于没有自动装箱,但具有扩展的数字转换。 在第一种情况下,扩展转换自动装箱都需要达到Integer签名; 但是,Java会进行自动装箱原始转换,而不是两者兼而有之。

在选择方法时,选择与所传递的参数最接近的参数。

在第一种情况下,数值可以选择三个不能直接映射的类。 由于Object是所有类的superdad,它与fn [Object]匹配,因此我是一个对象。

在第二种情况下,函数调用找到了与fn [integer]最接近的匹配函数,结果是因为我是一个整数。