编译器合约:用 Contract DSL 告诉编译器“我不会返回 null”
通过 Kotlin 的 contract 实验性功能,创建自定义智能函数契约来改进空安全分析。 · 难度:入门 · +10XP
编译器合约:用 Contract DSL 告诉编译器“我不会返回 null”
Kotlin 的 Contract 是作用于函数声明的 DSL,允许开发者向编译器声明函数调用的副作用或返回值关系。最常见的用途是帮助智能类型转换:例如标准库的 require() 使用了 contract 告知编译器如果返回则参数非空。本教程将手把手创建一个自定义断言函数,使其在 if 判断后自动进行非空缩小,并解释 contract 的三种主要类型:returns、returnsNotNull、callsInPlace。
import kotlin.contracts.*
fun String?.isNotNull(): Boolean {
contract {
returns(true) implies (this@isNotNull != null)
}
return this != null
}
fun main() {
val name: String? = "Kotlin"
if (name.isNotNull()) {
// 如果没有 contract,这里 name 仍被视作可空
println(name.length) // 智能类型转换生效
}
}