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

6

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

enter image description here


payload.email 的类型是什么? - Endzeit
1
@Endzeit 它是 public String getEmail()。它可能是 Java-Kotlin 翻译。 - Caleb Bolton
请问类型定义是用Java编写的吗?在使用Kotlin调用Java时,类型通常被写成String!,因为Kotlin无法确定这些平台类型是否可为空。也许这是一种不同的表示方法?这样做有一定的道理,意味着任何非空和可空字符串之间的任何类型。然而,我自己从未见过这种表示方式。 - Endzeit
我认为这不是有效的 Kotlin 代码:playground。神秘。 - Thomas
你能否写出 val email: String? = payload.email - Endzeit
显示剩余3条评论
1个回答

6

(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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接