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内置的扩展库,支持面向对象和面向过程两种操 ...
随机推荐
- MySQL之SQL语句的使用
SQL使用 mysql中的基本逻辑对象 mysql有这么几种对象 mysqld--->库---->表---->记录(由行和列组成)一条记录中的一列叫做字段 什么是关系型数据库 表与表 ...
- php_mvc实现步骤五
5.match_controller 控制器层典型实现 控制器类 依据功能的相关性,将一系列相关的功能,使用一个控制器类来处理,而该控制器的每个方法,就对因某个功能. 注意:控制器是按照功能划分的.( ...
- 8、2 es数据库的使用
1.注意问题.es和redis同时使用会报错 解决: package com.bw; import org.springframework.beans.factory.InitializingBean ...
- tetetet
http://www.wuwenhui.cn/2623.html http://www.360doc.com/content/16/1104/09/36005694_603810507.shtml
- 【LEETCODE】42、922. Sort Array By Parity II
package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...
- vue 仿写微信公众号自定义菜单
先看效果图 代码参考 <template> <div> <!-- 公众号设置 --> <el-col :span="24" style=& ...
- SpringBoot 返回Json实体类属性大小写问题
今天碰到的问题,当时找了半天为啥前台传参后台却接收不到,原来是返回的时候返回小写,但是前台依旧大写传参. 查了很多后发现其实是json返回的时候把首字母变小写了,也就是Spring Boot中Jack ...
- M-SOLUTIONS Programming Contest
A.(n-2)*180 #include<cstdio> #include<cstring> #include<iostream> #include<algo ...
- SQL Server 索引优化-----数据库引擎优化顾问
本文将根据“数据库引擎优化顾问”(DTA)来发现无用或缺失的索引. 要使用“数据库引擎优化顾问”,首先需要对数据库负载进行监控,为数据库负载分析准备数据.从SSMS的工具中,打开SQL Server ...
- NEST 多IndexType与分页
/// <summary> /// POST /_all/employee/_search?typed_keys=true /// </summary> public void ...