如何在 kotlin 中强制执行 null 安全注释检查?

sus*_*ide 4 kotlin

考虑这个例子:

import java.math.BigDecimal

fun main(args: Array<String>) {
  val s: String? = null
  BigDecimal(s)
}
Run Code Online (Sandbox Code Playgroud)

它编译时没有任何警告(使用 clikotlinc和 IntelliJ)并在运行时抛出:

Exception in thread "main" java.lang.NullPointerException
    at java.math.BigDecimal.<init>(BigDecimal.java:809)
    ...
Run Code Online (Sandbox Code Playgroud)

我尝试根据文档以不同的方式构建它,如下所示:

kotlinc \
 -Xnullability-annotations=@javax.annotation:strict \
 -Xnullability-annotations=@org.jetbrains.annotations:strict \
 -Xjsr305=strict \
Main.kt -d main.jar
Run Code Online (Sandbox Code Playgroud)

注释似乎在那里(如 IntelliJ 中所示):

BigDecimal 构造函数中的 @NotNull 注释

文件明确指出:

具有可空性注释的 Java 类型不会表示为平台类型,而是表示为实际的可空或非空 Kotlin 类型。

我在这里缺少什么?

Kli*_*cou 5

构造函数的参数BigDecimal被视为平台类型,因为构造函数实际上没有注释。

注释@NotNull是由 IDE 通过检查源代码即时计算的。如果您按住 ctrl+单击构造函数,您将转到源代码,您将看到没有注释。

  • 正确的解决方案是在 TypeScript 中引入类似“index.d.ts”的内容,因此,如果 JVM“平台”方法使用了额外的注释(如本主题中所示),则“kotlinc”可能会使用它并导致构建失败。每个人都可以在 Kotlin 中将任何 Java 库扩展为空安全。 (2认同)