在上一次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. orcad 删除不连接符号

    1. 双击不连接符号的引脚,如下面的1脚NC 2. 进入引脚的属性界面,取消Is No Connect

  2. .Net Core 1.1 + CentOs 7 环境配置

    centos7下使用yum安装mysql5.7.10 参考:http://www.cnblogs.com/hwd-cnblogs/p/5213337.html http://www.jb51.net/ ...

  3. C/C++ 面试-面向对象的特性

    面向对象的三大特性 此文只是简单介绍一下三大特性   详细介绍在: 封装:http://www.cnblogs.com/52why/p/7631381.html 继承:http://www.cnblo ...

  4. 设置程序崩溃时产生 core 文件的配置

    /* 不限制 core 文件的大小 */ ulimit -c unlimited /* 使用 pid 进行命名 */ echo " > /proc/sys/kernel/core_us ...

  5. mysql中数据表记录的增删查改(2)

    select `数据表.字段1`, group_concat(`数据表.字段2`) from `数据表` group by `数据表.字段1` order by `数据表.字段1` desc; sel ...

  6. CSS中position 和float的使用说明(清晰)

    当构建页面排版时,有不同的方法可以使用.使用哪一种方法取决于具体页面的排版要求,在不同的情况下,某些方法可能好过于其他的方法. 比如,可以使用若干个浮动元素来构建一个整洁简洁的页面排版.或者,如果需要 ...

  7. TZOJ5697: 数据结构实验:归并排序

    #include<stdio.h> #include<stdlib.h> void merge(int a[], int start,int mid,int end) { )) ...

  8. 字符串类型日期时间转换为Date类型解析转换异常java.text.ParseException: Unparseable date: “2019-09-27T18:31:31+08:00”

    错误的写法: SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //这里的格式也可以是别 ...

  9. 开源图像识别库OpenCV基于Maven的开发环境准备

    1.安装 JDK 8+,并设置 JAVA_HOME 环境变量 2.安装 Maven,并将 “/bin” 子目录设置到 path 环境变量 3.下载 OpenCV,官网传送门 也可以直接下载本人瘦身之后 ...

  10. [洛谷P5377][THUPC2019]鸽鸽的分割

    题目大意:有一个圆,圆上有$n$个点,将这几个点两两连接,问最多分成几部分 题解:发现这相当于一个平面图,由欧拉公式得($F$为平面分割块数,$E$为平面图边数,$V$为平面图点数):$$F=E-V+ ...