首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法调用转换

方法调用转换
EN

Stack Overflow用户
提问于 2015-10-29 08:11:44
回答 3查看 75关注 0票数 4

我试图理解如何用conversions.Let调用重载的方法,我用我正在尝试的一个例子解释我的问题

代码语言:javascript
复制
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的方法在包装器Integer.Please解释中被调用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-29 08:26:35

当方法重载表单出现时,用户试图在以这种方式选择的编译器之间调用,

  1. 与数据类型完全匹配,如果查找,然后立即调用。1.1如果完全匹配不匹配,那么编译器将尝试与更广泛的类型-数据类型匹配。
  2. 如果上述情况失败,那么它就开始与自动装箱方式相匹配.
  3. 以上两种情况都失败了,然后开始与vararg情况匹配.
  4. 以上所有情况都失败了,同时也给出了错误,比如无法解决方法名称。

因此,在您的示例5中,是integer(primitive),因此它开始与int‘(1- case )匹配,但失败,因此尝试与更广泛的数据类型匹配。在这里,它与long(原语)匹配,后者比'int‘更宽

因此,您将得到"Long“输出。

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

票数 3
EN

Stack Overflow用户

发布于 2015-10-29 08:15:01

过载解算有三个阶段。第一阶段尝试在不使用自动装箱和varargs的情况下找到匹配方法(这就是为什么选择meth(long i)而不是meth(Integer i))。只有当第一阶段没有找到任何匹配时,第二阶段才试图找到一种与自动装箱相匹配的方法。

票数 5
EN

Stack Overflow用户

发布于 2015-10-29 08:30:42

我知道这里的优先级是第一位的,是加宽的,然后是自动装箱的,然后是静脉曲张。因为扩大原始参数比自动装箱要好得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33408936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档