3

我想添加两个扩展函数来ResultSet获取一个值作为LocalDate.

fun ResultSet.getLocalDate(colName: String) = getDate(colName)?.toLocalDate()
fun ResultSet.getLocalDate(colIndex: Int) = getDate(colIndex)?.toLocalDate()

问题是getDate()返回 a Date!,显然如果没有?.之前的调用,我会得到一个 null 错误toLocalDate()。但是任何使用这个扩展的人都必须使用结果作为 aLocalDate?而不是 a LocalDate!

为了一致性起见,有什么方法可以维护平台类型?并让扩展函数的用户决定是否允许为空?还是我错误地将其视为不便而不是功能?

4

1 回答 1

4

从不同的角度来看:如果你可以让你的函数返回一个平台类型的值LocalDate!,Java 不安全的可空性将传播到你的 Kotlin 代码中的函数用法:它们会null随时返回,可能对使用 return 的调用者来说是意料之外的值为非空。

反过来,Kotlin是空值安全的,它不允许null静默传递到会导致 NPE 的地方。相反,每个值要么作为可空传递,要么通过非空检查或断言。

平台类型在语言中是不可表示的,这只是处理不安全的 Java 可空性的一种方式(简单地将所有 Java 值视为可空性是行不通的)。它们为您提供了一种方式来声明您相信对 Java 代码的此调用不会返回 null:当您视为T!as时T,会生成一个断言来检查它。否则,您可以T!像使用 nullable 一样使用平台类型T?

Null 安全性是 Kotlin 语言设计的关键点之一,它让您决定 Kotlin 代码中的每个值是否可以为空。

API 设计有两种选择:

  • 返回一个非空值,检查函数内部的可空性
  • 返回可为空的值,从而警告调用者可能null

但是,如果函数具有允许调用者假设它null在某些情况下不会返回的语义,则可以创建一个包装函数来进行断言。如果再加上额外的逻辑或回退,这是可行的,否则它几乎不会比!!调用现场的断言 ( ) 更简洁。

于 2016-03-29T15:39:59.873 回答