首页 > 解决方案 > Kotlin 空安全是否在编译器中实现?

问题描述

我想知道 Kotlin 是否需要以某种方式包装对象或携带一些标志来支持空安全。

此信息是否仅在编译期间可用(关于空安全性)还是泄漏到.class文件或字节码中?

我可以从 Java 代码中检查 Kotlin 空合约(用于方法参数和返回值)吗?

标签: kotlinnull

解决方案


Kotlin 编译器非常努力地防止 NullPointerExceptions 并强制您适当地处理可能的问题。但即使使用这些非常复杂的方法来避免 NPE,在某些情况下也是可能的。最好的例子是当我们想在 Kotlin 中使用一些 java 方法时。编译器无法说明来自 Java的类型(也称为平台类型)是否可以为 null。当将平台类型的值分配给变量时,编译器允许这样做,但稍后可能会导致 NullPointerException。这就是 Kotlin 严重依赖可空性注释(@Nullable@NotNull)。如果这些属性是在我们要调用的 Java 代码中定义的,那么编译器可以确保不会发生 NPE。当 Kotlin 编译器生成字节码时,它还提供可空性注解:

@Nullable
Integer myFunction(@NotNull MyClass first_value, @Nullable String second_value)

这是您从 Java 代码中找出 Kotlin 空合约的方式,据我所知,Kotlin 不会用一些额外的标志包装对象,因为它会使 Kotlin-Java 互操作性变得复杂。


推荐阅读