使用基本数据类型及其包装类的方法重载

16

我试图总结下面情景中所使用的规则。请解释为什么我会得到两个不同的输出。

情景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.");
    }
}
2个回答

19

Java语言规范中对方法签名解析有如下说明:

第一阶段(§15.12.2.2)执行重载解析,但不允许装箱或拆箱转换,或使用可变元方法调用。如果在此阶段未找到适用的方法,则处理继续进行到第二阶段。

在你的第二个案例中,涉及到int的方法签名可以应用,但是不涉及自动装箱,而是需要采用扩展数字转换。 在第一种情况下,需要采用扩展转换和自动装箱才能达到Integer的签名; 但是,在Java中,自动装箱或原始类型转换只能选择其中一种。


你能解释一下原始类型如何映射到 Object 类,因为原始类型的超类是 null 而不是 Object,那么它如何映射到以 Object 作为参数的方法调用呢? - Jayesh
首先,它通过自动装箱转换成一个对象。 - Marko Topolnik

-4

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

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

在第二种情况下,函数调用找到了与fn [integer]最接近的函数,因此结果为我是一个整数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接