方法调用转换

Method invocation conversions

我试图了解如何使用 conversions.Let 调用重载方法我用我正在尝试的示例解释我的问题

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);
    }
}

此处输出为:Long

为什么在 Wrapper 中调用参数为 long 的方法 Integer.Please 解释一下。

重载决议分为三个阶段。第一阶段尝试在不使用自动装箱和可变参数的情况下找到匹配方法(这就是为什么选择 meth(long i) 而不是 meth(Integer i) 的原因)。只有在第一阶段没有找到任何匹配时,第二阶段才尝试使用自动装箱找到匹配方法。

当方法重载形式出现并且用户尝试调用以这种方式选择的编译器时,

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

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

  3. 所有以上 2-case 都失败然后开始匹配 vararg case。
  4. 以上所有情况均失败,同时给出无法解析方法名称等错误。

所以在你的情况下 5 是 integer(primitive) 所以它开始匹配 int'(1 种情况),但失败所以尝试匹配更广泛的数据类型。 在这里,在你的情况下,它与 long(primitive) 匹配,它比 'int'

所以,你得到“Long”输出。

因此,重载场景时的编译器行为同样出现了。

我明白了 这里的优先级是 1st 是扩大自动装箱,然后是 varargs。 因为扩大原始参数比自动装箱要好得多。