Kotlin扩展作用域分析与扩展的根本作用解析
在上一次https://www.cnblogs.com/webor2006/p/11219358.html学习了Kotlin的扩展,继续这个话题继续拓展,首先提出这么一个问题:假如我们扩展的方法跟类中已有的方法一模一样,那最终调用的哪个方法呢?虽说这个问题有点白痴,但是为了学习得更加透彻有必要对这些细节也了解透,下面来试验一下:

调用看一下:

另外扩展方法也可以对已有方法进行重载,如下:

可空类型的扩展:
啥意思?我们知道Any是Kotlin所有类的顶层父类,所以我们可以对这个顶层类进行扩展,如下:

有啥意义?由于已经做了null的判断了,也就是如果扩展了Any为空的toString()的话,那就避免了我们在实际中的空指针异常了,利用扩展特性可以很好的进行规避。
扩展属性:
除了扩展函数之外,还可以扩展属性,比较简单,直接看个代码既可:

伴生对象的扩展:
也比较简单,直接上程序:

扩展的作用域分析:
对于扩展来说,其实也会有作用域的概念,下面先抛出理论:
1、扩展函数所定义在的类实例叫做分发接收者(dispatch receiver)。
2、扩展函数所扩展的那个类的实例叫做扩展接收者(extension receiver)。
3、当以上两个名字出现冲突时,扩展接收者的优先级最高。
是不是一头雾水,不要紧,接下来咱们举例来说明,之前我们的扩展定义都是在顶层的,如下:

其实它可以在类中进行定义,如下:

其中该方法是对DD类的扩展,所以它就可以DD已经拥有的成员,比如:

除此之外,还能够使用定义这个扩展方法所在类的成员,也就是发接收者(dispatch receiver)的成员,指的是:

如下:

接下来再来定义一个方法:

接下来再来扩展一个方法:

接下来看一下神操作:

接一来看之前的这个理论:“3、当以上两个名字出现冲突时,扩展接收者的优先级最高。”,这条规则就已经说明了答案,啥是扩展接收者呀,看定义:“2、扩展函数所扩展的那个类的实例叫做扩展接收者(extension receiver)。”,所以指的是:

所以,这个输出肯定是输出的DD.toString(),那。。假如我想还要打印EE.toString()呢,Kotlin也提供有机制,如下:

接下来再来定义一个方法:

写这个方法是为了衬托扩展的作用域的,下面咱们在main方法中也来调用DD.output(),你会发现奇迹:

居然找不到这个扩展的方法,为啥?因为output的扩展是在EE里面声明的,所以它的扩展只能在EE里面使用,这也道出了扩展的作用域了,好,接下来调用test()方法:

扩展的根本作用:
好,接下来对扩展进行一个总结,扩展到底有啥用呢?其实它可以很好地解决Java中充斥的各种辅助类问题,怎么理解,我们可以回顾一下在Collections.java中充斥了大量的辅助类,比如:


像这些排序照理应该就是本身属于集合中的,不应该还得用一个辅助类来搞,那通过Kotlin的扩展功能就可以很轻松的简化原来Java辅助类的功能呢?比如swap()方法,原来用java的方式写法是这样的:

而用了Kotlin的扩展功能可以简化为:

也就是系统集合木有提供swap方法,但是可以用Kotlin的扩展功能给集合加上该功能,再比如binarySearch(),原来得这样写:

而用了Kotlin的扩展会简化为:

Kotlin扩展作用域分析与扩展的根本作用解析的更多相关文章
- PHP扩展编写、PHP扩展调试、VLD源码分析、基于嵌入式Embed SAPI实现opcode查看
catalogue . 编译PHP源码 . 扩展结构.优缺点 . 使用PHP原生扩展框架wizard ext_skel编写扩展 . 编译安装VLD . Debug调试VLD . VLD源码分析 . 嵌 ...
- Java 动态代理机制分析及扩展
Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...
- RNA-Seq differential expression analysis: An extended review and a software tool RNA-Seq差异表达分析: 扩展评论和软件工具
RNA-Seq differential expression analysis: An extended review and a software tool RNA-Seq差异表达分析: 扩展 ...
- Kotlin 特性 语法糖 优势 扩展 高阶 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Java 动态代理机制分析及扩展,第 1 部分
Java 动态代理机制分析及扩展,第 1 部分 http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/ 本文通过分析 Java 动态代理的机制和特 ...
- Selenium WebDriver 中鼠标和键盘事件分析及扩展(转)
本文将总结 Selenium WebDriver 中的一些鼠标和键盘事件的使用,以及组合键的使用,并且将介绍 WebDriver 中没有实现的键盘事件(Keys 枚举中没有列举的按键)的扩展.举例说明 ...
- PHP扩展迁移为PHP7扩展兼容性问题记录
PHP7扩展编写的时候,提供的一些内核方法和之前的PHP之前的版本并不能完全兼容.有不少方法参数做了调整.下面是在迁移过程中遇到的一些问题.记录下来,避免大家再踩坑. add_assoc_string ...
- Asp.net 面向接口可扩展框架之“Mvc扩展框架及DI”
标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整 ...
- win10 64位安装memcache扩展和开启redis扩展
前面有关于win10下搭建wamp环境的介绍,在此不在赘述,php操作memcache有memcache库和memcached库,其中memcache是php内置的扩展库,支持面向对象和面向过程两种操 ...
随机推荐
- 有些新电脑采用“UEFI”作为固件。由于UEFI不支持DOS,所以在UEFI环境下安装的WIN10等系统也就无法使用基于DOS的一键GHOST
有些新电脑采用“UEFI”作为固件.由于UEFI不支持DOS,所以在UEFI环境下安装的WIN10等系统也就无法使用基于DOS的一键GHOST
- 在ObjectARX中创建OPM项目的时候出现 MIDL1012: argument illegal for switch / header错误的解决方式
修改为 这样新建的带有MIDL项目就不会提示错误这个错误了. 如果你已经建立好项目,可以尝试修改MIDL的配置,头文件可能是.h没有文件名,所以出现MIDL1012错误,修改为项目名称的.h即可,保持 ...
- java的Array和List相互转换
1.Array转List,通过java.util.Arrays.asList(T... a)参数是可变泛型参数 注意,Arrays.asList返回的类型是不可变长度的集合,底层是final修饰的泛型 ...
- 「中山纪中集训省选组D4T1」折射伤害 高斯消元
题目描述 在一个游戏中有n个英雄,初始时每个英雄受到数值为ai的伤害,每个英雄都有一个技能"折射",即减少自己受到的伤害,并将这部分伤害分摊给其他人.对于每个折射关系,我们用数对\ ...
- [转帖]微软宣布加入 OpenJDK 项目
微软宣布加入 OpenJDK 项目 https://news.cnblogs.com/n/646003/ 近日,微软的 Bruno Borges 在 OpenJDK 邮件列表中发布了一条消息,内容包含 ...
- API总结
1. 什么是Webservice WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过 Web 来调用这个应用程序.我们把调用这个WebServ ...
- idea 中激活 JRebel
JRebel介绍: JRebel是一款JVM插件,它使得Java代码修改后不用重启系统,立即生效.IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启 Tomcat 服务器,修改才能 ...
- pytorch 0.4.0迁移指南
总说 由于pytorch 0.4版本更新实在太大了, 以前版本的代码必须有一定程度的更新. 主要的更新在于 Variable和Tensor的合并., 当然还有Windows的支持, 其他一些就是支持s ...
- wpf Log4net的配置和使用
现在项目涉及的是cs客户端,在项目中使用log4net记录本地日志和异常信息,这里项目做完了,想着自己做一个demo,测试记录一下log4Net的配置使用. 第一步.新建一个wpf应用程序,项目右键 ...
- 配置Setting.xml文件提高maven更新下载jar包速度
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...