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内置的扩展库,支持面向对象和面向过程两种操 ...
随机推荐
- [LeetCode] 244. Shortest Word Distance II 最短单词距离 II
This is a follow up of Shortest Word Distance. The only difference is now you are given the list of ...
- nodepad++格式化html代码
如果没有安装插件
- 在ensp中RSTP基础设置
为什么我们要有rstp? rstp就是stp的加强版 实验模拟内容 搭建拓扑 相关参数(实验的时候看看自己的mac地址可能与我的并不同) 我们开始配置RSTP基本功能,由于交换机默认开启MSTP,所有 ...
- VueJS中学习使用Vuex详解
转载自:https://segmentfault.com/a/1190000015782272,做了部分修改(这里建议不要用所谓的getters,一来多次一举,二来模块化时会产生很不协调的用法) 在S ...
- android 8.0 以后 uiautomator 无法直接使用的问题
android8.1以后sdk tools自带的uiautomator直接打开,截取不到机器界面信息. 可以使用以下方法手动截取. 首先操作机器定位到要分析的界面. 1.截取uix资源文件 adb s ...
- vs中web api程序不包含适合于入口点的静态“Main”方法
步骤:选择该项目的属性--应用程序--输出类型--类库
- 数组,const,#define
#include<stdio.h> #define COUNT 6 int main(){// const类型的常量不能作为数组的个数,大部分编译器不支持// const int C ...
- JQuery 总结篇
一.基础知识 1.jq的使用 在script块中: 方式1:$(function(){ $("[使用选择器] ...
- 解决python中的Non-UTF-8 code starting with ‘\xbs4’ in file错误
出现错误如下图: 主要原因为编辑python脚本使用的编辑器编码有问题.我使用的编辑器是notepad++,由于没有做Python语言编辑配置,默认使用的是ANSI编码(右下角位置有编码格式),如下: ...
- Nginx限制访问速率和最大并发连接数模块--limit (防范DDOS攻击)
Tengine版本采用http_limit_req_module进行限制 具体连接请参考 http://tengine.taobao.org/document_cn/http_limit_req_cn ...