【解密 Kotlin 扩展函数】扩展函数的创建(十六)

news2024/11/14 2:28:16

导读大纲

    • 1.1 为第三方的类添加方法: 扩展函数

1.1 为第三方的类添加方法: 扩展函数

  1. Kotlin 的主题之一与现有代码的平滑集成

    • 即使是纯 Kotlin 项目,也是构建在 Java 库之上
      1. 如 JDK、Android 框架和其他第三方框架
    • 而当你将 Kotlin 集成到 Java 项目中时
      1. 你还要处理尚未或不会转换为 Kotlin 的现有代码
    • 如果能在使用这些 API 时使用 Kotlin 的所有优点
      1. 无需重写它们, 岂不美哉?
  2. 从概念上讲,扩展函数很简单

    • 扩展函数的本质是: 一个可以作为类的成员被调用,但定义在类之外的函数
    • <1> 为了演示扩展函数,添加一个计算字符串最后一个字符的方法
      1. 暂时忽略处理空字符串的边缘情况
package strings
fun String.lastChar(): Char = this.get(this.length - 1) // <1>
  1. 只需在添加的函数名称前加上要扩展的类或接口的名称即可

    • 这个类名被称为接收器类型; 而调用扩展函数的值被称为接收器对象
      title
    • 在扩展函数声明中,接收器类型是定义扩展的类型
      1. 可以用它来指定函数要扩展的目标类型
    • 接收器对象是该目标类型的实例,可以用它来访问所扩展类型的属性和方法
      1. 这里String就是要扩展的目标类型this就是String类型的实例对象
      2. 简单理解就是:lastChar() 方法是 String 类型的成员
  2. 可以使用与普通类成员相同的语法调用该函数

    • <1> 这里String是接收器类型, "Kotlin"是接收器对象
fun String.lastChar() = this.get(this.length -1)       // <1>
fun main() { 
    println("Kotlin".lastChar())                       // <1>
}
  1. 从某种意义上说,你为 String 类添加自己的方法

    • 尽管 String 类并不是您代码的一部分,甚至可能没有该类的源代码
      1. 但您仍然可以在项目中用您需要的方法来扩展它
    • 只要编译成 Java 类, 就可以在该类中添加自己的扩展方法
  2. 在扩展函数的主体中, 与在成员方法中使用 this 的方式相同

    • <1> 与在Java的普通成员方法中一样
      1. 访问对象的属性和方法可以省略"this"关键字
    • <2> 这里可以简化 lastChar() 扩展函数的实现, 省略其中的this
      1. this.get(this.length -1) ==> get(length - 1)
/* Java */
public class Example {
    private final String name;
    public Example(String name) {
        this.name = name;
    }
    public void sayHello() {
        System.out.println("Hello " + name);              // <1>
    }
}
=======================================================
package strings
fun String.lastChar(): Char = get(length - 1)             // <2>
  1. 在扩展函数(就像在类中定义方法)中,可以直接访问被扩展类的方法和属性

    • 但是要注意,扩展函数只是扩展功能,而不允许你破坏封装
      1. 与类中定义的方法不同,扩展函数不能访问私有或受保护的成员
  2. 在扩展函数的主体中,你可以调用接收器的任何方法(methods)
    1. 这里的方法指的是,既可以调用类中原有的成员函数,也可以调用扩展函数

    • 在调用方法时,扩展函数与成员函数是没有区别
      1. 而且通常情况下,特定方法是成员函数还是扩展函数不重要
    • 扩展函数强大之处就在于可以利用它来扩展源代码中的类
      1. 即使你都没有这个类的源代码
    • <1> 比如在你的代码中调用 lastChar()方法
      1. 根本不需要关注该方法String类自带的还是第三方库扩展
      2. 对于调用者来说,这种调用是无感的
fun main() { 
    println("Kotlin".lastChar())                       // <1>
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2156957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu清理内存导致的一系列错误及解决方法

文章目录 火狐浏览器和pycharm消失打不开 安不上 卸不掉后记 火狐浏览器和pycharm消失 打不开 安不上 卸不掉 清理内存后&#xff0c;火狐和pycharm的图标都消失了&#xff0c;在终端输入Firefox显示无法打开 应当先snap install firefox&#xff0c;然而snap install firefo…

【排序算法】插入排序_直接插入排序、希尔排序

文章目录 直接插入排序直接插入排序的基本思想直接插入排序的过程插入排序算法的C代码举例分析插入排序的复杂度分析插入排序的优点 希尔排序希尔排序&#xff08;Shell Sort&#xff09;详解希尔排序的步骤&#xff1a;希尔排序的过程示例&#xff1a;希尔排序的C语言实现举例…

啥?Bing搜索古早BUG至今未改?

首先&#xff0c;大家先看下面的一个数学公式。 Γ ( z ) ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)∫0∞​tz−1e−tdt. 看不懂&#xff1f;没关系&#xff0c;因为我也看不懂 这不是谈论的重点。 当你把鼠标光标移到公式的最开头&…

netflix是什么样的企业文化

netflix是什么样的企业文化 Netflix的企业文化以其“自由与责任”而闻名&#xff0c;这种文化理念在业界被广泛誉为管理的“黄金法则”。《奈飞文化手册》自2009年面世以来&#xff0c;便迅速成为全球企业管理的典范&#xff0c;吸引了超过1500万次的在线阅读与下载。Netflix的…

【C++篇】引领C++模板初体验:泛型编程的力量与妙用

文章目录 C模板编程前言第一章: 初始模板与函数模版1.1 什么是泛型编程&#xff1f;1.1.1 为什么要有泛型编程&#xff1f;1.1.1 泛型编程的优势 1.2 函数模板的基础1.2.1 什么是函数模板&#xff1f;1.2.2 函数模板的定义格式1.2.3 示例&#xff1a;通用的交换函数输出示例&am…

【网络】高级IO——Reactor版TCP服务器

目录 1.什么是Reactor 1.1.餐厅里的Reactor模式 2.Reactor的由来 2.1.单 Reactor 单进程 / 线程 2.2.单 Reactor 多线程 / 多进程 2.3.多 Reactor 多进程 / 线程 3.实现单 Reactor 单进程版本的TCP服务器 3.1.Connection类 3.2.TcpServer类 3.3.Connection的真正用处 …

深蓝学院-- 量产自动驾驶中的规划控制算法 小鹏

文章目录 0. 前言1.发展现状2.行车功能中难点问题及解决思路问题1&#xff1a;车道居中辅助&#xff0c;画龙&#xff0c;蛇行问题。问题2&#xff1a;外界环境扰动以及传感器信息缺失下的横向控制难点问题3&#xff1a;大坡度平稳停车 3. 泊车功能中难点问题及解决思路问题1&a…

Spring AOP - 配置文件方式实现

目录 AOP基础概念 示例1&#xff1a;模拟在com.text包及子包项下所有类名称以ServiceImpl结尾的类的所有方法执行前、执行后、执行正常后返回值、执行过程中出异常的情况 示例2&#xff1a;统计com.text包及子包项下所有类名称以DaoImpl结尾的类的所有方法执行时长情况 AOP基…

汽车总线之---- CAN FD总线

CAN FD 最高可支持8M/s的通信速率&#xff0c;从传统CAN到CAN FD的转换是很容易实施和推广的。 CAN FD报文的帧&#xff1a;标准帧&#xff0c;扩展帧 CAN FD 标准帧结构 CAN FD 报文的标准帧与CAN 报文的标准帧的区别 CAN FD 报文的标准帧与CAN FD报文的扩展帧的区别&…

lsof可以查看当前系统中正在被使用的文件,包括动态库

lsof的英文是 list open files lsof打印结果的最后一列是Name&#xff0c;表示正在被使用或打开的文件名或动态库名 lsof直接回车&#xff0c;会显示很多&#xff0c;可以配合more命令查看 一个文件或动态库可能被多个进程打开&#xff0c;lsof会显示多行 lsof | more -1…

uniapp小程序持续获取用户位置信息,后台位置获取

做一个小程序持续获取用户位置信息的功能&#xff0c;即使小程序切换到后台也能继续获取&#xff0c;getLocation这个api只有小程序在前台才能获取位置&#xff0c;所以不用这个 先申请一个腾讯地图key 在uniapp项目配置源码视图里加上这个代码 先获取权限&#xff0c;再开启…

[项目:微服务即时通讯系统客户端(基于C++QT)]三,左侧界面搭建

三&#xff0c;左侧界面搭建 一&#xff0c;导入 先把MainWidget类做成“单例类” 采用的是单例模式&#xff0c;让某一个类&#xff0c;在指定进程中只有唯一的实例 先看一下MainWidget的框架 QWidget//这部分是头文件保护宏&#xff0c;确保该头文件只被包含一次&#x…

240922-chromadb的基本使用

A. 背景介绍 ChromaDB 是一个较新的开源向量数据库&#xff0c;专为高效的嵌入存储和检索而设计。与其他向量数据库相比&#xff0c;ChromaDB 更加专注于轻量化、简单性和与机器学习模型的无缝集成。它的核心目标是帮助开发者轻松管理和使用高维嵌入向量&#xff0c;特别是与生…

【软件工程】数据流图和数据字典

一、数据流图 3.符号 分析结果 二、数据字典 例题 选择题

使用build_chain.sh离线搭建匹配的区块链,并通过命令配置各群组节点的MySQL数据库

【任务】 登陆Linux服务器&#xff0c;以MySQL分布式存储方式安装并部署如图所示的三群组、四机构、 七节点的星形组网拓扑区块链系统。其中&#xff0c;三群组名称分别为group1、group2和group3&#xff0c; 四个机构名称为agencyA、agencyB、agencyC、agencyD。p2p_port、cha…

Python | Leetcode Python题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; class Solution:def levelOrder(self, root: Node) -> List[List[int]]:if not root:return []ans list()q deque([root])while q:cnt len(q)level list()for _ in range(cnt):cur q.popleft()level.append(cur.val)for child in c…

爬虫过程 | 蜘蛛程序爬取数据流程(初学者适用)

蜘蛛程序&#xff08;也称网络爬虫&#xff0c;是搜索引擎的重要组成部分&#xff09; 主要功能&#xff1a;遍历互联网&#xff0c;抓取网站信息并建立索引&#xff0c;便于用户在搜索引擎中检索到最新的网页内容工作原理&#xff1a;从初始网站页面的URL开始&#xff0c;发送…

qt-C++笔记之Q_DECLARE_METATYPE和qRegisterMetaType

qt-C笔记之Q_DECLARE_METATYPE和qRegisterMetaType code review! 文章目录 qt-C笔记之Q_DECLARE_METATYPE和qRegisterMetaType一.Q_DECLARE_METATYPE使用方法应用场景 二.为什么需要注册类型&#xff1f;三.使用 Q_DECLARE_METATYPE 处理自定义类型的简短示例3.1.自定义类型定…

《独孤九剑》游戏源码(客户端+服务端+数据库+游戏全套源码)大小2.38G

《独孤九剑》游戏源码&#xff08;客户端服务端数据库游戏全套源码&#xff09;大小2.38G ​ 下载地址&#xff1a; 通过网盘分享的文件&#xff1a;【源码】《独孤九剑》游戏源码&#xff08;客户端服务端数据库游戏全套源码&#xff09;大小2.38G 链接: https://pan.baidu.co…

生信服务器 | 组蛋白甲基化修饰、DNA亲和纯化测序、优青博导团队指导设计、解读实验结果。

查看原文>>>生信服务器 | 组蛋白甲基化修饰、DNA亲和纯化测序、优青博导团队免费指导设计、解读实验结果、一台服务器解决您所有的分析困扰!