在 Kotlin 中,:: 被称为引用操作符(Reference Operator)。它的核心作用是:“获取一个实体的引用,而不是立即执行它。”
:: 主要还有以下三个核心用途:
- 属性引用 (Property References)
就像函数引用一样,你可以获取一个类中属性(变量)的引用。
• 写法:对象::属性名
• 用途:主要用于反射(Reflection)或者某些需要动态获取属性值的 API 中(例如某些序列化库或动态 UI 框架)。
例子:
data class User(val name: String)
fun main() {
val user = User("Alice")
// 获取 name 属性的引用
val property = User::name
// 在反射中你可以通过这个引用来获取值
println(property.get(user)) // 输出: Alice
}
- 类引用 / 类型引用 (Class References)
这是 Kotlin 反射系统的基础。它用于获取一个类的 KClass 对象,从而在运行时获取该类的构造函数、方法、属性等信息。
• 写法:类名::class
• 用途:这是 Android 开发中非常常见的操作,例如在依赖注入(Hilt/Koin)、反射创建实例、或者处理泛型时。
例子:
class MyActivity
fun main() {
// 获取 MyActivity 的类引用 (KClass)
val kClass = MyActivity::class
println(kClass.simpleName) // 输出: MyActivity
println(kClass.java.isAccessible) // 获取底层的 Java Class
}
注:在 Kotlin 中,获取类引用必须用 ::class。这与 Java 的 MyActivity.class 不同。
- 构造函数引用 (Constructor References)
你可以通过 :: 获取类构造函数的引用。虽然在 Kotlin 中不如 Java 常用,但在某些高级反射场景下很有用。
例子:
class Person(val name: String)
fun main() {
// 获取 Person 类的构造函数引用
val constructor = Person::class.primaryConstructor
// 使用构造函数创建一个新实例
val person = constructor?.call("Bob")
println(person)
}
对比:
| 符号 | 动作 | 结果 | 例子 |
|---|---|---|---|
.(成员访问操作符) | 执行(Execution) | 立即运行代码,或取出当前属性值 | appState.navigateBack() |
::(可调用引用操作符) | 标记(Reference) | 取得该函数/属性/类的“地址”,得到一个可传递的对象 | appState::navigateBack |
1.延迟执行:有些时候你现在不想执行这个动作,你只是想把这个“动作”告诉另一个组件(比如按钮的 onClick),等用户真的点击了,再由那个组件去执行它。
2.反射与动态性:如果你不知道程序运行到哪一步时需要调用哪个方法,或者你想动态地遍历一个类里所有的属性,你就必须用 :: 来获取这些信息。
3.符合函数式编程:在许多高级编程范式中,把“函数”当做“数据”来传递是非常常见的做法。:: 就是把函数变成数据的桥梁。
{ appState.navigateBack() } 与 appState::navigateBack
在 Kotlin 中,这两者代表了不同的函数表达方式:一个是匿名函数(Lambda 表达式),一个是函数引用(Function Reference)。
- { appState.navigateBack() } —— 匿名函数 (Lambda Expression)
这是最常用的方式。你定义了一个新的函数块,并在执行这个块时去调用 appState.navigateBack()。
• 本质:这是一个新的函数对象。每当这个 Lambda 被创建时(在某些情况下),它实际上是创建了一个闭包。
• 灵活性:极高。你可以在调用函数之前或之后添加任何逻辑。
◦ 例子:onBackPress = { println(“Going back…”); appState.navigateBack() }
◦ 例子:onBackPress = { appState.navigateBack(someExtraId) }(可以传递额外参数)。
• 捕获(Closure):它会“捕获”当前作用域中的变量(如 appState)。 - appState::navigateBack —— 函数引用 (Function Reference)
这是 Kotlin 提供的一种语法糖,它直接指向 appState 对象上的 navigateBack 方法。
• 本质:它不是创建一个新的函数对象,而是引用一个已经存在的函数。
• 灵活性:较低。它只能直接调用该方法。如果你需要传递额外参数或者在调用前后加逻辑,就不能直接用这种写法。
• 性能:略高。因为它不需要创建新的 Lambda 对象,直接引用内存中已有的方法。
• 约束:目标函数的参数列表必须与接收端的函数类型完全匹配。如果 navigateBack 需要参数而你提供的是 () -> Unit,这种写法就会报错。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/u010505364/article/details/166904060



