首页 > 解决方案 > Kotlin 和 IntelliJ IDEA 中 Reactor 代码中的空类型安全性

问题描述

我的 Kotlin 课程中有以下代码:

Mono.just("banana").subscribe({
    println(it)
})

IntelliJ IDEA 告诉我,在这种情况下,变量“it”的类型为“String!” (见截图)。

IntelliJ IDEA 截图

我不确定这是否是 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!”类型的?而不是“字符串”?

标签: javaintellij-ideakotlinnullableproject-reactor

解决方案


这里的问题是 Kotlin 将来自非空安全平台(如 Java)的所有类型视为平台类型,因此在这种情况下文档所说的并不重要。如果您尝试使用的东西(Mono在这种情况下)不是用 Kotlin 编写的,它将是一个平台类型。

您可以注释您的 Java 方法以缓解此问题,因此在您的情况下,我的猜测是Mono该列表中没有任何注释:

  • JetBrains(@Nullable@NotNullorg.jetbrains.annotations包中)
  • 安卓(com.android.annotationsandroid.support.annotations
  • JSR-305 ( javax.annotation)
  • 查找错误 ( edu.umd.cs.findbugs.annotations)
  • 日食 ( org.eclipse.jdt.annotation)
  • 龙目岛(lombok.NonNull)。

推荐阅读