我正在尝试制定下面方案中使用的规则。请解释为什么我得到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.");
}
}
答案 0 :(得分:18)
Java Language Specification说明了方法签名解析:
第一阶段(§15.12.2.2)执行重载解析而不允许装箱或拆箱转换,或使用变量arity方法调用。如果在此阶段没有找到适用的方法,则处理继续到第二阶段。
在第二种情况下,涉及int
的方法签名适用于没有自动装箱,但扩展了数字转换。在第一种情况下,需要扩展转换和自动装箱才能达到Integer
签名;但是,Java 要么自动装箱或原始转换,而不是两者。
答案 1 :(得分:-3)
选择方法时,会选择与传递的参数最匹配的参数。
在第一种情况下,数值可以选择三个不能直接映射的类。由于Object是所有类的superdad,它与fn [Object]匹配,因此我是一个对象。
在第二种情况下,函数调用找到了与fn [integer]最接近的匹配函数,结果为我是一个整数。