Kotlin-扩展功能和平台类型?

时间:2016-03-29 15:13:34

标签: nullable kotlin kotlin-extension

我想向ResultSet添加两个扩展函数,其值为LocalDate

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

问题是getDate()返回Date!,显然我可能会在?.之前没有toLocalDate()调用时收到空错误。但是,使用此扩展程序的任何人都必须将结果用作LocalDate?而不是LocalDate!

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

1 个答案:

答案 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)更简洁。