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

导读大纲

    • [1.1 为第三方的类添加方法: 扩展函数](#1.1 为第三方的类添加方法: 扩展函数)

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

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

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

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

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

    • <1> 这里String是接收器类型, "Kotlin"是接收器对象
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)
kotlin 复制代码
/* 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. 对于调用者来说,这种调用是无感的
kotlin 复制代码
fun main() { 
    println("Kotlin".lastChar())                       // <1>
}
相关推荐
非优秀程序员8 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻9 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
沐晓时光9 小时前
C语言入门,内存函数知识讲解
c语言·开发语言
文丑颜不良啊11 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang12 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪12 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息13 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼13 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff14 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈