我想知道Kotlin是否需要包装对象或携带一些标志以支持null安全。
此信息仅在编译过程中可用(关于空安全性)还是泄漏到.class
文件或字节码中?
我可以从Java代码检查Kotlin空合同(获取方法参数和返回值)吗?
答案 0 :(得分:6)
Kotlin编译器非常努力地保护其免受NullPointerExceptions的影响,并迫使您适当地处理可能的问题。但是,即使采取了避免NPE的非常复杂的方法,在某些情况下还是有可能的。最好的例子是当我们想在Kotlin中使用一些Java方法时。编译器无法确定来自Java的类型(也称为 platform type )是否可以为null。当将平台类型的值分配给变量时,编译器允许它使用,但稍后可能导致NullPointerException。这就是Kotlin高度依赖可空性注释(@Nullable
和@NotNull
)的原因。如果这些属性在我们要调用的Java代码中定义,则编译器可以确保不会发生NPE。当Kotlin编译器生成字节码时,它还会提供可空性注释:
@Nullable
Integer myFunction(@NotNull MyClass first_value, @Nullable String second_value)
这是您从Java代码中查找Kotlin空合同的方式,据我所知,Kotlin不会用其他标志包装对象,因为这会使Kotlin-Java的互操作性变得复杂。
答案 1 :(得分:1)
我想知道Kotlin是否需要包装对象或携带一些标志以支持null安全。
就像 type 安全一样, null 安全也涉及编译时间。 Kotlin不仅不需要包装对象,而且此功能的实质是在编译时证明不需要运行时检查。
此信息仅在编译过程中可用(关于空安全性)还是泄漏到
.class
文件或字节码中?
可空性信息在编译期间可用,正是因为它们存在于.class
文件中。 Kotlin只会编译您自己的代码,而不会编译整个标准库和您的所有依赖项。
我可以从Java代码检查Kotlin空合同(获取方法参数和返回值)吗?
您可以通过反思(通过查找可空性注释)。但是,如上所述,这样做是毫无意义的。