(String..String?)
表示一个带有下界为 String
和上界为 String?
(可空字符串)的灵活类型。这不是有效的 Kotlin 代码(它不能被表示),但在编译器内部使用,因此有时会在 IntelliJ 的提示中出现。
(在 JVM 上,我们经常看到使用 !
的 平台类型,例如 String!
,这是灵活类型的更特定的情况)
这是 Kotlin 的一种方式,表明它不知道为 payload.email
声明的 String
类型是否可空(例如如果在 Java 中声明,Java 不区分它们),但它也不想强制执行其中任何一个,以方便使用(因此 "灵活")。
正如名称所示,灵活类型是灵活的 - 类型 (L..U) 的值可以用于需要 L 和 U 之间可能类型之一的任何上下文中。
这意味着即使该值的实际类型介于 "String" 和 "String?" 之间,该类型的值也可以用于期望 "String" 的位置,即使该值的真实类型可能是 "String?",因此该值可以为 null。
这很有用,因为假设它是 "String" 将使 null 检查被标记为多余,并且假设它是 "String?" 将强制开发人员在每个地方编写 null 检查,即使他们可能知道这个特定的 Java 方法不会返回 null。
总的来说,最好明确声明从 Java 获取的变量的类型,以避免传播平台类型和由此带来的不确定性(和不安全性):
val email: String = payload.email // if you know it cannot be null
val email: String? = payload.email // if you don't know
payload.email
的类型是什么? - Endzeitpublic String getEmail()
。它可能是 Java-Kotlin 翻译。 - Caleb BoltonString!
,因为Kotlin无法确定这些平台类型是否可为空。也许这是一种不同的表示方法?这样做有一定的道理,意味着任何非空和可空字符串之间的任何类型。然而,我自己从未见过这种表示方式。 - Endzeitval email: String? = payload.email
? - Endzeit