Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 扩展函数

扩展函数

扩展函数(Extension Functions)是 Kotlin 中一项强大的特性,允许开发者在不修改原始类的情况下,为现有类添加新的函数。这一特性极大地增强了代码的可读性和灵活性,同时避免了继承或装饰器模式的复杂性。

1. 扩展函数的定义

扩展函数的语法如下:

fun ClassName.functionName(parameters): ReturnType {
    // 函数体
}

其中:

  • ClassName 是被扩展的类(称为接收者类型)。
  • functionName 是扩展函数的名称。
  • 在函数体内,可以通过 this 访问接收者对象的成员(类似于类的成员函数)。

示例:为 String 类添加扩展函数

fun String.addExclamation(): String {
    return "$this!"
}

fun main() {
    val greeting = "Hello"
    println(greeting.addExclamation()) // 输出:Hello!
}

2. 扩展函数的特性

(1)静态解析

扩展函数是静态绑定的,即在编译时根据接收者的声明类型确定调用的函数,而非运行时实际类型。例如:

open class Animal
class Dog : Animal()

fun Animal.speak() = "Animal sound"
fun Dog.speak() = "Woof!"

fun main() {
    val animal: Animal = Dog()
    println(animal.speak()) // 输出:Animal sound(静态解析为 Animal 的扩展函数)
}

(2)作用域限制

扩展函数的作用域取决于其定义的位置:

  • 定义在顶层(包级):全局可用,需导入。
  • 定义在类内:仅在该类中可用。

(3)与成员函数的优先级

如果扩展函数与类的成员函数同名且参数相同,成员函数优先调用。

3. 扩展函数的实际应用场景

(1)增强标准库类

// 为 List 添加一个计算平均值的扩展函数
fun List<Int>.average(): Double {
    if (isEmpty()) return 0.0
    return sum().toDouble() / size
}

(2)简化工具类

替代 Java 中的静态工具类:

// 传统工具类
object StringUtils {
    fun capitalize(str: String): String {
        return str.replaceFirstChar { it.uppercase() }
    }
}

// Kotlin 扩展函数方式
fun String.capitalize(): String {
    return replaceFirstChar { it.uppercase() }
}

(3)DSL 构建

扩展函数是构建领域特定语言(DSL)的核心工具之一:

fun html(init: HTML.() -> Unit): HTML {
    val html = HTML()
    html.init()
    return html
}

class HTML {
    fun body(init: Body.() -> Unit) { ... }
}

// 使用 DSL
html {
    body {
        // 配置 body
    }
}

4. 扩展属性

Kotlin 还支持扩展属性(Extension Properties),但需要注意:

  • 不能存储状态(不能有幕后字段)。
  • 语法与扩展函数类似。

示例:

val String.lastChar: Char
    get() = this[length - 1]

fun main() {
    println("Kotlin".lastChar) // 输出:n
}

5. 注意事项

  1. 扩展函数不是真正的类成员,无法访问私有或受保护的成员。
  2. 过度使用扩展函数可能导致代码可读性下降,建议合理使用。
  3. 优先为标准库或第三方库的类添加扩展,而非自己的类(直接修改类更合适)。

通过扩展函数,Kotlin 实现了对现有类的无缝扩展,同时保持了代码的简洁性和表现力。

Last Updated:: 5/21/25, 7:58 PM