Kotlin 编译器可以要求非空断言吗?

Can the Kotlin Compiler Require non-null assertion?

Kotlin 编译器可以要求非空断言吗?

例如。我从 JOOQ 得到一个查询结果,相关类型是 Record!。但是编译器允许我访问成员而不检查空值。

val orderResult = RowanDatabaseConnector.runInContext(DatabaseContext.BOOKSTORE) {
    it.select(SPREE_ORDERS.asterisk())
        .from(SPREE_ORDERS)
        .where(SPREE_ORDERS.ID.eq(orderId.toInt()))
        .fetchOne()
}

return Cart(
    user = currentUser,
    subTotal = orderResult.get(SPREE_ORDERS.ITEM_TOTAL).toFloat(),
    taxTotal = orderResult.get(SPREE_ORDERS.ADDITIONAL_TAX_TOTAL).toFloat(),
    total = orderResult.get(SPREE_ORDERS.TOTAL).toFloat(),
    lineItems = listOf()
)        

是否有类似于 Typescript 的 strictNullCheck 的内容要求我断言 orderResult 不为空?

对于平台类型(以!结尾的任何类型),您可以使用显式类型规范来声明它是否应该为空。

如果你想明确表示 orderResult 可能为空,那么你可以这样写:

val orderResult: Record? = /* trimmed */

相反,如果您想明确表示 orderResult 不可能为空,那么您可以这样写:

val orderResult: Record = /* trimmed *

通过选择这两个选项之一,类型将为 Record?Record 而不是 Record!。因此,您将从 Kotlin 获得您习惯的 null 安全性。