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

时间:2015-01-14 10:07:29

标签: java overloading autoboxing

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

2 个答案:

答案 0 :(得分:18)

Java Language Specification说明了方法签名解析:

  

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

在第二种情况下,涉及int的方法签名适用于没有自动装箱,但扩展了数字转换。在第一种情况下,需要扩展转换自动装箱才能达到Integer签名;但是,Java 要么自动装箱原始转换,而不是两者。

答案 1 :(得分:-3)

选择方法时,会选择与传递的参数最匹配的参数。

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

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