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

Moh*_*gar 15 java autoboxing overloading

我正在尝试制定下面方案中使用的规则.请解释为什么我得到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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

场景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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*nik 18

Java语言规范说,这大约方法签名分辨率:

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

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