前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java重载匹配算法

Java重载匹配算法

原创
作者头像
code-x
发布2022-12-03 22:21:10
5920
发布2022-12-03 22:21:10
举报
文章被收录于专栏:code-x

算法如下

  1. 找出全部可以调用的方法。(可以调用的方法意味着形參个数等于实參个数,实參的类型可以转换为方法形參的类型。)
  2. 假设实參与形參的类型可以直接相应。则运行该方法。
  3. 假设可以调用的方法仅仅有一个。则运行该方法。
  4. 可以调用的方法不止一个时, 逐一作出推断: 假设一个方法的类型签名都可以赋值给还有一个方法。则类型大的(超类)被排除;反复此操作,直到无法排除为止。【the Most Specific Method】
  5. 经过步骤4,假设仅仅剩下一个方法, 则运行该方法. 否则编译器报错.

但是Java中还存在主动装箱和变长參数, 这会使问题更复杂(还有import static 因素)

所以,大致了解一下就够了

以下是几个例子

①首先不考虑自己主动装箱和变长參数②再加上自己主动装箱③再加上自己主动装箱变长參数

样例1:有void m(Object )、void m(int[] )、m(int )方法,

代码语言:javascript
复制
    Object obj = null;
    m(obj);

依照(2)调用m(Object )

样例2:有void m(Object )、void m(int[] )、m(int )方法,

代码语言:javascript
复制
    m(null);

依照(4),排除m(Object )后。调用void m(int[] )

样例3:有void m(Object )、void m(int[] )、m(String )方法,

代码语言:javascript
复制
    m(null);

依照(4),排除m(Object )后,void m(int[] )和m(String )无法排除。依照(5),编译报错。

样例4:有void f(double,float )、void f(float , double )方法,

代码语言:javascript
复制
    f(12 ,9);

依照(5),编译报错。

样例5:有void f(double,float )、void f(float , double )和void f(double ,int )方法,

代码语言:javascript
复制
    f(12 ,9);

依照(5),编译报错。f(double,float )- f(float , double )

样例6:有void f(double,float )、void f(float , double )和void f(float,int )方法。

代码语言:javascript
复制
    f(12 ,9);

依照(4), 调用f(float , int)

编译器并不总是能选择到正确的方法, 如果和泛型搭配, 可能会发生意外情况, 比如这个 https://blog.22xcode.com/post/138

https://www.cnblogs.com/mfrbuaa/p/4713799.html https://www.cnblogs.com/keeya/p/12780847.html https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档