我想知道Kotlin是否需要以某种方式包装对象或携带一些标志来支持null安全性。
这些信息是仅在编译期间可用(关于空安全(,还是泄露到.class
文件或字节码?
我可以从Java代码中检查Kotlin null约定吗(方法参数和返回值(?
Kotlin编译器非常努力地保护不受NullPointerException的影响,并迫使您适当地处理可能的问题。但是,即使有这些非常复杂的手段来避免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 null契约的方法,而且据我所知,Kotlin不会用一些额外的标志来包装对象,因为这会使Kotlin的Java互操作性变得复杂。
我想知道Kotlin是否需要以某种方式包装对象或携带一些标志来支持null安全性。
就像类型安全性一样,null的安全性与编译时有关。Kotlin不仅不需要包装对象,而且这个特性的本质是它在编译时证明了不需要运行时检查。
此信息是否仅在编译期间可用(关于null安全性(,或者已泄露到
.class
文件或字节码?
在编译过程中可以获得可为Null性信息,正是因为它存在于.class
文件中。Kotlin只编译您自己的代码,它不会编译整个标准库和您的所有依赖项。
我可以从Java代码中检查Kotlin null合约吗(用于方法参数和返回值(?
您可以通过反射(通过查找可为null的注释(。然而,如上所述,这样做毫无意义
如其他答案中所述,Kotlin使用两个注释@Nullable
和@NotNull
来标记Kotlin中定义的类型的可空性。
而对于Java中定义的类型,它们被认为是platform type
,用户可以将它们用作可为null或不可为null的类型。但是,编译器将发出对方法kotlin/jvm/internal/Intrinsics.checkNotNullExpressionValue
的调用。这意味着platform type
可能会导致运行时错误。
一个没有提到的特殊情况是泛型类型参数的可为Null性。例如CCD_ 11。在该示例中,两个通用类型参数String
和String?
的可为空性不是通过注释来指示的。相反,编译器会将这些信息存储到相应字节码的元数据中。使用kotlinx-metadata-jvm
包可以自己解码这样的元数据。
你可以在我的博客中找到更多信息。