使用原语及其包装方法的方法重载
问题内容:
我正在尝试制定以下方案中使用的规则。请解释为什么我得到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那样 无论是 自动装箱 或 原语转换,不可能兼顾。