这个 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
这意味着即使值的实际类型是 "介于 String
和 String?
" 之间的某处,也可以使用此类型的值即使在期望 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
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
这意味着即使值的实际类型是 "介于 String
和 String?
" 之间的某处,也可以使用此类型的值即使在期望 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