【问题标题】:Method overloading with primitives and their wrappers使用原语及其包装的方法重载
【发布时间】:2015-01-14 10:07:28
【问题描述】:

我正在尝试制定在以下场景中使用的规则。请解释为什么我得到 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 overloading autoboxing


    【解决方案1】:

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

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

    在您的第二种情况下,涉及int 的方法签名在没有自动装箱的情况下适用,但具有扩大的数字转换。在第一种情况下,需要扩大转换自动装箱才能达到Integer 签名;然而,Java 要么自动装箱原语转换,从不两者兼而有之。

    【讨论】:

    • 你能解释一下原始类型如何映射到Object类,因为原始类型超类是null而不是Object,然后它如何映射到以Object为参数的方法调用。
    • 它首先通过自动装箱转换转换为对象。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-10
      • 2017-07-25
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多