使用原语及其包装方法的方法重载


问题内容

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