这个 Kotlin 类型是什么:(String..String?)

What is this Kotlin type: (String..String?)

IntelliJ 向我展示了我的变量类型 (String..String?) 的上下文提示。我在互联网上找不到任何提及,这是什么类型?

(String..String?) 表示具有下限 String 和上限 String?flexible type(可空字符串)。这不是有效的 Kotlin 代码(它不是 可表示的)但它用于编译器内部,因此有时在 IntelliJ 的提示中使用。

(在 JVM 上,我们经常看到 平台类型 使用 !,如 String!,这是灵活类型的更具体情况)

这是 Kotlin 的表达方式,它不知道为 payload.email 声明的 String 类型是否可为空(例如,如果在 Java 中声明它't distinct those), 但为了方便起见,它不想强制执行其中任何一个(因此“灵活”)。

As the name suggests, flexible types are flexible — a value of type (L..U) can be used in any context, where one of the possible types between L and U is needed

这意味着即使值的实际类型是 "介于 StringString?" 之间的某处,也可以使用此类型的值即使在期望 String 的地方,即使该值的实际类型可能是 String?,因此该值可能为 null。

这很有用,因为假设它是 String 将意味着空检查将被标记为冗余,并且假设它是 String? 将迫使开发人员在所有地方编写空检查,即使他们可能知道这个特定的 Java 方法不能 return null.

一般来说,显式声明从 Java 获得的变量类型是一种很好的做法,以避免平台类型的传播和随之而来的不确定性(和不安全):

val email: String = payload.email // if you know it cannot be null
val email: String? = payload.email // if you don't know