【问题标题】:Method invocation conversions [duplicate]方法调用转换[重复]
【发布时间】:2015-10-29 17:09:06
【问题描述】:

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

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 Integer 中调用带有 long 参数的方法。请解释一下。

【问题讨论】:

标签: java autoboxing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      我明白 这里的优先级是第一个是扩大然后自动装箱然后是可变参数。 因为扩大原始参数比自动装箱要好得多。

      【讨论】:

        猜你喜欢
        • 2014-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-31
        • 2012-02-05
        • 1970-01-01
        • 1970-01-01
        • 2015-07-09
        相关资源
        最近更新 更多