java - Kotlin 和 IntelliJ IDEA 中 Reactor 代码中的空类型安全性
问题描述
我的 Kotlin 课程中有以下代码:
Mono.just("banana").subscribe({
println(it)
})
IntelliJ IDEA 告诉我,在这种情况下,变量“it”的类型为“String!” (见截图)。
我不确定这是否是 Kotlin、IntelliJ IDEA 或 Reactor 的问题,但根据Project Reactor 文档,它应该有空注释,并且 Mono 类不允许传递空值。
我正在使用 Kotlin 1.3.31 版,并且在我的 pom.xml 中有以下内容:
<build>
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<configuration>
<args>
<arg>-Xjsr305=strict</arg>
</args>
<compilerPlugins>
<plugin>spring</plugin>
</compilerPlugins>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>1.3.31</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
所以我的问题是,为什么变量“it”是“String!”类型的?而不是“字符串”?
解决方案
这里的问题是 Kotlin 将来自非空安全平台(如 Java)的所有类型视为平台类型,因此在这种情况下文档所说的并不重要。如果您尝试使用的东西(Mono
在这种情况下)不是用 Kotlin 编写的,它将是一个平台类型。
您可以注释您的 Java 方法以缓解此问题,因此在您的情况下,我的猜测是Mono
该列表中没有任何注释:
- JetBrains(
@Nullable
和@NotNull
从org.jetbrains.annotations
包中) - 安卓(
com.android.annotations
和android.support.annotations
) - JSR-305 (
javax.annotation
) - 查找错误 (
edu.umd.cs.findbugs.annotations
) - 日食 (
org.eclipse.jdt.annotation
) - 龙目岛(
lombok.NonNull
)。
推荐阅读
- python - 如何在不同的虚拟机上制作多线程套接字
- c++ - 如何以 if else 或 switch case 格式对 auto& 进行编码?
- jmeter - 尝试使用 Beanshell Sampler 在 Jmeter 中读取 csv 文件
- c# - winform Timer.timer 会创建一个新线程吗?
- bash - 嵌套 if else bash 语句
- ios - 观察来自 Firebase 的调用在函数退出后不更新字典的值
- python - 接受用户输入并说它是更大类别的一部分
- reactjs - useContext 值在测试中返回未定义
- junit - 我已经等了 10 多分钟,但没有看到 JUnit 停止或完成
- python - 用python写一个带有fastq对名称的txt文件