方法调用转换

时间:2015-10-29 08:11:44

标签: java autoboxing

我试图了解如何通过转换调用重载方法。让我用我正在尝试的示例解释我的问题

public class Autoboxing {

    public void meth(Integer i){
        System.out.println("Integer");
    }
    public void meth(long i){
        System.out.println("Long");
    }
    public void meth(int... i){
        System.out.println("int");
    }

    public void meth(Object i){
        System.out.println("Object");
    }

    public static void main(String[] args) {
        Autoboxing box= new Autoboxing();
        box.meth(5);
    }
}

这里的输出是:长

为什么在Wrapper Integer中调用带有参数long的方法。请解释。

3 个答案:

答案 0 :(得分:5)

重载分辨率有三个阶段。第一阶段尝试在不使用自动装箱和变量的情况下找到匹配方法(这就是选择meth(Integer i)而不是{{1}}的原因)。仅当第一阶段没有找到任何匹配时,第二阶段才会尝试使用自动装箱找到匹配的方法。

答案 1 :(得分:2)

当Method Overloaded窗体出现时,用户尝试在以这种方式选择的编译器之间调用,

  1. 如果找到,则立即与数据类型完全匹配,然后立即调用。 1.1如果完全匹配不匹配,则编译器尝试匹配更广泛的类型数据类型。

  2. 如果上述情况失败,则开始与自动装箱方式匹配。

  3. 以上所有2例失败然后开始与vararg案例匹配。
  4. 以上所有情况都失败,同时给出错误,例如无法解决方法名称。
  5. 所以在你的情况下5是integer(primitive)所以它开始与int'匹配(1例),但是失败,所以尝试匹配更广泛的数据类型。 在这种情况下,在您的情况下,它与long(原始)相匹配,后者比int'

    更广泛

    所以,你得到" Long"输出

    因此,同样在重载方案时编译器行为也来了。

答案 2 :(得分:0)

我理解 这里的优先级是第一个是加宽然后自动装箱然后是varargs。 因为扩大原始参数比自动装箱要好得多。