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

Method overloading with primitives and their wrappers

我正在尝试制定在以下场景中使用的规则。请解释为什么我得到 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 Language Specification 关于方法签名解析是这样说的:

The first phase (§15.12.2.2) performs overload resolution without permitting boxing or unboxing conversion, or the use of variable arity method invocation. If no applicable method is found during this phase then processing continues to the second phase.

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

选择方法时,会选择最接近传递参数的参数。

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

在第二种情况下,函数调用找到了与 fn[integer] 最接近的匹配函数,结果是 I am an integer.