其实这是一个很老的问题了,很久以前就在园子里看到有人对此迷惑,当时也没太在意,觉得哪会有人那么写代码。直到最近丁学君的这篇文章:“关于参数为可空值类型的多个重载的优先级”才让我对这个问题重新有了兴趣。并且做出了一个大胆的猜想,现在这个猜想已经被我验证了。

所有具备单向隐式类型转换或者存在继承关系的类型的方法重载,当使用null值调用时,将会使用隐式类型转换的方向来确定调用哪个方法。

简而言之,假设TypeA和TypeB之间存在一个隐式类型转换或者继承关系,方向是TypeA对象可以隐式转换为TypeB(TypeA存在一个到TypeB的隐式类型转换或者TypeA派生于TypeB)。

又有两个方法的重载如下:

public void MyMethod( TypeA obj ){ … }//重载A

public void MyMethod( TypeB obj ){ … }//重载B

那么MyMethod( null )一定会选择重载A。

但是这还没完,我仔细测定了各种情况的调用情况,并和装配脑袋一起分析整理了一下,还有如下结论:

1、对于Nullable<T>类型而言,T所拥有的运算符(包括隐式类型转换运算符)都会被投射到T?类型。比如说,int有一个隐式类型转换到long,那么int?也就会自动存在一个隐式类型转换到long?。同样的,TypeA?也有一个隐式类型转换到TypeB?(如果TypeA和TypeB是值类型)。这就解释了丁学文章中所说的问题。

2、如果两个类型之间存在双向的隐式类型转换,即TypeA可以隐式类型转换为TypeB,而TypeB也可以隐式类型转换为TypeA,这种情况下,使用null值调用会是一个编译错误。推广开来,如果多个类型之间存在一个闭环的隐式类型转换,比如说TypeA->TypeB,TypeB->TypeC,TypeC->TypeA,那么如果这三个类型的重载都存在的话,使用null值调用同样的编译错误,但是如果只有两个类型的重载存在(即方法重载的参数类型不存在闭环)那么也不会有错误。

3、数组的协变也会被看作是一个隐式类型转换,比如说TypeA派生于TypeB,则TypeA[]存在一个到TypeB[]的隐式转换,这个被称之为数组的协变。那么这个隐式转换也会被这个规则采信,即如果两个方法的参数是TypeA[]和TypeB[]的话,采用null值调用会选择TypeA[]的重载。

4、VB中也采用类似的规则,这一点有待装配脑袋的确认。

C#关于参数为null(空值)的方法调用,重载顺序选择彻底研究相关推荐

  1. java方法的参数类型_Java 基础 14 方法的重载 与 方法参数类型详解

    1.1 方法重载的概述和特点 方法重载概述 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可. 方法重载特点 与返回值类型无关,只看方法名和参数列表 在调用时,虚拟机通 ...

  2. java继承链中方法调用优先级.顺序:this.show(object)super.show(object)this.show((super)object)super.show((super))

    先看代码如下: 运行结果 在上述代码中,类B继承了类A,类C继承了类B,A中show()方法发生了重载,B中重写了A中的show(C )方法. 这里先说一下向上造型的一个知识点:向上造型时,编译期时根 ...

  3. 【JavaSE05】Java中方法与重载、递归

    1.方法的声明和调用 什么是方法?为什么需要方法?代码复用,方便软件升级 什么是方法? 具备特定功能的一段独立的代码段 标准的方法格式:(注意格式的顺序) 修饰符 返回值类型 方法名(参数类型 参数名 ...

  4. java多态调用优先级_关于java的多态方法调用顺序的问题

    使用父类类型的引用指向子类的对象,该引用调用的师父类中定义的方法和变量,变量不能被重写(覆盖):如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法: 注意特殊情况,如 ...

  5. 方法的重载(overload)和重写(override)的区别

    方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现.如 ...

  6. java数组循环动态赋值_04、Java基础语法(循环嵌套、break、continue、方法、方法的重载、数组动态初始化)...

    复习: 流程控制语句 - 顺序结构 - 分支结构 - if-else - switch - 循环结构 - for - while - do...while ctrl + alt + L 格式化代码 & ...

  7. java系列2:方法的重载

    对于功能类似的方法来说,因为参数列表不一样,但却需要记住多个不同的方法名称,太麻烦了. 如下面这个例子,不同个数的相加的方法们方法类似,但参数列表不一样,按理说说方法名称应该不同,因为可能不知道调用的 ...

  8. laytpl语法_浅谈laytpl 模板空值显示null的解决方法及简单的js表达式

    浅谈laytpl 模板空值显示null的解决方法及简单的js表达式 laytpl 模板语法 {{ d.field }} 输出一个普通字段,不转义html 官方的说明 但d.field 为空时会显示nu ...

  9. mockito+junit 单元测试 测试私有方法利用反射去调用提升覆盖率 反射调用时传入参数为 null

    今天公司安排我写单元测试 因为要通过三级认证 公司要求是覆盖率必须达到100% 而在写单元测试的时候 对于是否要测试私有方法一直是一个争议 公司规范 对私有方法也进行测试 代码如下: private ...

最新文章

  1. Java如何执行操作系统的CMD命令行
  2. tensorflow loss nan 解决办法
  3. 吴恩达机器学习 -- 正则化
  4. 函数sprintf真好用
  5. 2018年90后薪资报告出炉:你在哪个级别???
  6. 计算机基础八进制和十六进制试题,计算机基础知识考试试题
  7. 大数据分块_谷歌卫星影像金字塔分块下载原理说明
  8. win10wifi间歇性断网重启后恢复_实用!Xbox Series X 在重启后也能快速恢复之前的游戏状态...
  9. 《Linux Shell脚本攻略》读书笔记第二章 命令之乐
  10. python参考手册 第二章
  11. c语言编译器手机版显示错误,C语言编译器的错误信息
  12. 电脑怎么彻底卸载程序
  13. office word安装mathtype报错,找不到mathpage.WLL文件
  14. 小草与大树的一分钟演讲
  15. python pdf删除图片_【原创】python批量删除pdf图片水印(Xobject)的一种方法
  16. 【腾讯云新知实验室】一站式提供视频解决方案
  17. 解决银河麒麟系统开机后桌面无图标,只有下方开始菜单和任务栏可操作问题
  18. mysql优化之query_cache_type的DEMAND参数介绍
  19. Power BI Paginated Reports分页报表
  20. 米筐量化如何安装使用?

热门文章

  1. Win64 驱动内核编程-12.回调监控进线程创建和退出
  2. hdu3374最小表示法+KMP
  3. hdu4302 set或者线段树
  4. 【Google Play】正式版上架流程 ( 创建版本 | 设置国家地区 | 发布正式版 )
  5. 【Android 安装包优化】APK 打包流程 ( 文件结构 | 打包流程 | 安装流程 | 安卓虚拟机 )
  6. 关于MyEclipse连接SQLServer和Mariadbsql
  7. mybatis08--关联查询多对一
  8. 对象及变量的并发访问一
  9. LAMBDA表达式常用 (全)
  10. 汇编语言随笔(8)-实验9(显示字符串)、实验10(子程序:除法溢出,数值到字符串的转换)和课程设计1