我想向ResultSet
添加两个扩展函数,其值为LocalDate
。
fun ResultSet.getLocalDate(colName: String) = getDate(colName)?.toLocalDate()
fun ResultSet.getLocalDate(colIndex: Int) = getDate(colIndex)?.toLocalDate()
问题是getDate()
返回Date!
,显然我可能会在?.
之前没有toLocalDate()
调用时收到空错误。但是,使用此扩展程序的任何人都必须将结果用作LocalDate?
而不是LocalDate!
。
为了保持一致性,有什么方法可以维护平台类型吗?让扩展函数的用户决定是否允许它可以为空?或者我错误地将其视为不便而不是功能?
答案 0 :(得分:4)
从不同角度看待它:如果你可以使你的函数返回平台类型LocalDate!
的值,那么Java不安全的可空性会扩展到你的Kotlin代码中的函数用法:它们会返回{{1}在任何时候,使用返回值为非null的调用者可能意外。
Kotlin,反过来,is null-safe并且它不允许null
默默地传递到导致NPE的地方。相反,每个值都可以作为可空传递或传递非空检查或断言。
Platform types在语言中是不可表示的,这只是一种处理不安全的Java可空性的方法(简单地将所有Java值都视为可空wouldn't work)。它们为您提供了一种方式来表明您认为此Java代码调用不会返回null :当您将null
视为T!
时,会生成一个断言检查一下。否则,您使用平台类型T
和可空T!
。
空安全是Kotlin语言设计的关键点之一,它可以让您决定Kotlin代码中的每个值是否可以为空。
您有两种API设计选择:
T?
但是,如果一个函数具有允许调用者假定它在某些条件下不会返回null
的语义,则可以创建一个包装函数来进行断言。如果再加上额外的逻辑或回退,这是可行的,否则它将比调用站点的断言(null
)更简洁。