x1c 0d1x如何理解不支持常规类型参数、变量参数和数组元素为空性?有没有一个例子来支持它?不支持哪种书写方式?对于Kotlin1.1+版本,默认行为与-Xjsr 305 =warn相同。strict值需要在从Spring API推断的Kotlin类型中考虑Spring Framework API空安全性,但应该在了解Spring API空性声明甚至可以在次要版本之间演变并且将来可能会添加更多检查的情况下使用。“我不太理解次要版本之间可控性声明的演变,演变是什么?
waxmsbnn1#
通常,当从Kotlin调用Java定义的函数时,无法确定参数、泛型类型和返回类型的可空性,因为Java没有提供声明可空性的标准方法。对于这种情况,Kotlin有一个maybe-nullable类型,它在类型名称后用!而不是?表示。您不能在自己的代码中使用此类型,但IDE会将其作为Java函数返回的类型显示给您。例如,如果你像这样调用一些Java定义的函数:
!
?
val x = someJavaBasedApi.fetchSomeString()
那么Kotlin不知道x是String还是String?,所以它将其视为String!。这实际上与String相同,除了它不会立即执行运行时检查以确保它不是null,并且如果您检查它是否为null以确保安全,编译器也不会抱怨。如果你把它赋给一个不可空的变量,但它实际上是空的,你会触发一个NullPointerException崩溃。Spring显然使用了一些注解来使Kotlin可以在大多数情况下检测到这种可空性,但在所描述的三种情况下却不是这样。关于泛型类型的可能示例:
String
String?
String!
val x = someSpringApi.fetchAList<String>()
您正在使用不可空的String类型作为您想要获取的列表类型。因此,您可能期望它返回List<String>,但实际上它是List<String!>。如果你这样做,你可能会崩溃:
List<String>
List<String!>
val x = someSpringApi.fetchAList<String>() val y: String = x[0] // possibly assigning null to a non-nullable variable
对于数组,同样的事情也可能发生,它返回一个Array<String!>,而不是一个Array<String>。我想不出关于varargs的例子,因为我不知道Spring是如何使用它们的。
Array<String!>
Array<String>
varargs
1条答案
按热度按时间waxmsbnn1#
通常,当从Kotlin调用Java定义的函数时,无法确定参数、泛型类型和返回类型的可空性,因为Java没有提供声明可空性的标准方法。
对于这种情况,Kotlin有一个maybe-nullable类型,它在类型名称后用
!
而不是?
表示。您不能在自己的代码中使用此类型,但IDE会将其作为Java函数返回的类型显示给您。例如,如果你像这样调用一些Java定义的函数:那么Kotlin不知道x是
String
还是String?
,所以它将其视为String!
。这实际上与String
相同,除了它不会立即执行运行时检查以确保它不是null,并且如果您检查它是否为null以确保安全,编译器也不会抱怨。如果你把它赋给一个不可空的变量,但它实际上是空的,你会触发一个NullPointerException崩溃。Spring显然使用了一些注解来使Kotlin可以在大多数情况下检测到这种可空性,但在所描述的三种情况下却不是这样。
关于泛型类型的可能示例:
您正在使用不可空的
String
类型作为您想要获取的列表类型。因此,您可能期望它返回List<String>
,但实际上它是List<String!>
。如果你这样做,你可能会崩溃:对于数组,同样的事情也可能发生,它返回一个
Array<String!>
,而不是一个Array<String>
。我想不出关于
varargs
的例子,因为我不知道Spring是如何使用它们的。