我想知道Kotlin是否需要包装对象或携带一些标志以支持null安全。

该信息仅在编译过程中可用(关于安全性为空)还是泄漏到.class文件或字节码中?

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

最佳答案

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空契约(Contract)的方式,据我所知,Kotlin不会用其他标记来包装对象,因为这会使Kotlin-Java的互操作性变得复杂。

07-25 23:19
查看更多