平台相关声明
Kotlin 多平台代码的一个关键功能是让公共代码能够依赖平台相关声明的一种方式。在其他语言中,这通常可以通过在公共代码中构建一组接口并在平台相关模块中实现这些接口来完成。但是,当在某个平台上有一个实现所需功能的库,并且希望直接使用该库的API而无需额外包装器时,这种方法并不理想,此外它需要以接口表示公共声明,这无法覆盖所有可能情况
作为替代方案,Kotlin提供了一种 预期声明与实际声明的机制。利用这种机制,公共模块可以定义 预期声明,而平台模块可以提供与预期声明相对应的实际声明
//公共模块
package org.jetbrains.foo
expect class Foo(bar: String) {
fun frob()
}
fun main() {
Foo("Hello").frob()
}
//JVM模块
package rog.jetbrains.foo
actual class Foo actual constructor(val bar: String) {
actual fun frob() {
println("Frobbing the $bar")
}
}
上面的示例阐明了几个要点:
- 公共模块中的预期声明与其对应的实际声明始终具有完全相同的完整限定名
- 预期声明标有 export 关键字;实际声明标有 actual 关键字
- 与预期声明的任何部分匹配的所有实际声明都需要标记为 actual
- 预期声明决不包含任何实现代码
预期声明并不限于接口与接口成员。编译器会确保每个预期声明在实现相应公共模块的所有平台中都具有实际声明,并且如果缺少任何实际声明,编译器都会报错。