在上一次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扩展作用域分析与扩展的根本作用解析的更多相关文章

  1. PHP扩展编写、PHP扩展调试、VLD源码分析、基于嵌入式Embed SAPI实现opcode查看

    catalogue . 编译PHP源码 . 扩展结构.优缺点 . 使用PHP原生扩展框架wizard ext_skel编写扩展 . 编译安装VLD . Debug调试VLD . VLD源码分析 . 嵌 ...

  2. Java 动态代理机制分析及扩展

    Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...

  3. 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差异表达分析: 扩展 ...

  4. Kotlin 特性 语法糖 优势 扩展 高阶 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. Java 动态代理机制分析及扩展,第 1 部分

    Java 动态代理机制分析及扩展,第 1 部分 http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/ 本文通过分析 Java 动态代理的机制和特 ...

  6. Selenium WebDriver 中鼠标和键盘事件分析及扩展(转)

    本文将总结 Selenium WebDriver 中的一些鼠标和键盘事件的使用,以及组合键的使用,并且将介绍 WebDriver 中没有实现的键盘事件(Keys 枚举中没有列举的按键)的扩展.举例说明 ...

  7. PHP扩展迁移为PHP7扩展兼容性问题记录

    PHP7扩展编写的时候,提供的一些内核方法和之前的PHP之前的版本并不能完全兼容.有不少方法参数做了调整.下面是在迁移过程中遇到的一些问题.记录下来,避免大家再踩坑. add_assoc_string ...

  8. Asp.net 面向接口可扩展框架之“Mvc扩展框架及DI”

    标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整 ...

  9. win10 64位安装memcache扩展和开启redis扩展

    前面有关于win10下搭建wamp环境的介绍,在此不在赘述,php操作memcache有memcache库和memcached库,其中memcache是php内置的扩展库,支持面向对象和面向过程两种操 ...

随机推荐

  1. android基础---->SharedPreferences的使用

    SharedPreferences 还支持多种不同的数据类型存储,如果存储的数据类型是整型,那么读取出来的数据也是整型的,存储的数据是一个字符串,读取出来的数据仍然是字符串.这样你应该就能明显地感觉到 ...

  2. appium怎么按下系统按键?如按下返回键、home键等等

    ava_client3.0版本以后使用pressKeyCode方法,之前的版本使用sendKeyEvent方法 1. 返回:driver.pressKeyCode(AndroidKeyCode.BAC ...

  3. ENSP静态链路聚合实验配置要点及实例

    链路聚合分为:静态链路聚合.动态链路聚合链路聚合的负载分担模式:对于二层数据流,系统会根据MAC地址(源mac地址和目的mac地址来计算),而对于三层数据流则会根据ip地址来进行负载分担计算. 静态链 ...

  4. ERP解析外围系统json数据格式

    外围系统调用ERP的WebService接口,将数据以json格式传到ERP,ERP解析json 1.创建java source jsp,提供java方法解析json数据 create or repl ...

  5. session知识点小结

    Session: 1. 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象HttpSession中. 2. 快速入门: 1. 获取HttpSession对象: Http ...

  6. linux shell程序常用功能

    一.循环读取文件 循环读取文件方式有多种,推荐下列方法 while read line;do local include=$(echo ${line} | grep "filter" ...

  7. lmir 随笔

    近期需要研究一些特征工程的工作,就打算把微软之前公布出来的特征都复现一遍,今天遇到的特征是 LMIR, 其实也就是language model for information retrieval的简写 ...

  8. Java性能调优—— VisualVM工具基本使用及监控本地和远程JVM进程超详细使用教程

  9. Js学习02--变量、关键字、标识符

    一.Js变量的定义 1.定义变量的目的 在内存中分配一块存储空间给变量,方便以后存储数据. 2.如何定义变量 任何变量在使用前都必须定义变量 var 变量名称 eg: var name,age,sex ...

  10. sharepoint中的Power Shell命令创建、删除文档库列表

    ListTemplateType 枚举: 自定义列表-GenericList.文档库-DocumentLibrary.图片库-PictureLibrary.公告-Announcements.联系人-C ...