扩展函数的编译原理
Kotlin扩展函数编译原理详解。
1. 扩展函数本质
fun String.addExclamation(): String = this + "!"
编译为静态方法:
public static final String addExclamation(String receiver) {
return receiver + "!";
}
2. 关键特性
2.1 不修改原类
扩展函数是静态解析的,不会真正修改被扩展的类。
2.2 静态分发
open class Animal
class Dog : Animal()
fun Animal.sound() = "Generic"
fun Dog.sound() = "Woof"
val animal: Animal = Dog()
animal.sound() // "Generic" — 静态分发,看声明类型
2.3 不能访问私有成员
扩展函数不能访问类的 private 成员,因为它本质上是外部静态方法。
3. 与成员函数冲突
class Foo {
fun bar() = "member"
}
fun Foo.bar() = "extension"
Foo().bar() // "member" — 成员函数优先