Kotlin null安全是否在编译器中实现?
我想知道Kotlin是否需要包装对象或携带一些标志来支持空安全性 此信息仅在编译期间可用(关于空安全性),还是泄漏到Kotlin null安全是否在编译器中实现?,kotlin,null,Kotlin,Null,我想知道Kotlin是否需要包装对象或携带一些标志来支持空安全性 此信息仅在编译期间可用(关于空安全性),还是泄漏到.class文件或字节码 我是否可以从Java代码中检查Kotlin null contract(方法参数和返回值)?Kotlin编译器非常努力地防止NullPointerException,并强制您适当地处理可能的问题。但即使使用这些非常复杂的方法来避免NPE,也有一些情况是可能的。最好的例子是当我们想在Kotlin中使用一些java方法时。编译器无法确定来自Java的类型(也称
.class
文件或字节码
我是否可以从Java代码中检查Kotlin null contract(方法参数和返回值)?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编译器非常努力地防止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是否需要包装对象或携带一些标志来支持空安全性
与类型安全性一样,空安全性也适用于编译时。Kotlin不仅不需要包装对象,而且这个特性的本质是在编译时证明不需要运行时检查
此信息仅在编译期间可用(关于空安全性),还是泄漏到.class
文件或字节码
可空性信息在编译期间可用,正是因为它存在于.class
文件中。Kotlin只编译您自己的代码,它不会编译整个标准库和所有依赖项
我可以从Java代码中检查KotlinNullContract(方法参数和返回值)吗
您可以通过反射(通过查找可空性注释)来实现。然而,如上所述,这样做毫无意义
我想知道Kotlin是否需要包装对象或携带一些标志来支持空安全性
与类型安全性一样,空安全性也适用于编译时。Kotlin不仅不需要包装对象,而且这个特性的本质是在编译时证明不需要运行时检查
此信息仅在编译期间可用(关于空安全性),还是泄漏到.class
文件或字节码
可空性信息在编译期间可用,正是因为它存在于.class
文件中。Kotlin只编译您自己的代码,它不会编译整个标准库和所有依赖项
我可以从Java代码中检查KotlinNullContract(方法参数和返回值)吗
您可以通过反射(通过查找可空性注释)来实现。但是,如上所述,这样做是毫无意义的。您认为
@Nullable
和@NotNull
实际上属于哪个包?有几个候选:这些注释属于org.jetbrains.annotations
包。@Nullable
和@NotNull
实际上属于哪个包?有几个候选项:这些注释属于org.jetbrains.annotations
包。请参阅我对问题的评论。除非您明确告诉编译器,否则Kotlin编译器会添加运行时检查。我知道在不可为null的类型中仍然存在一些使null
为null的纠结和方法,但从概念上讲,null安全性是指消除对这些检查的需要。许多来自Java的开发人员似乎忽视了这一点,他们一直认为这是关于自动运行时检查的,这是真的。如果你有100%的Kotlin,就不可能有NPE。如果你有混音,那就很难了。正如您所说,虽然编译器通过注入运行时检查来确保其安全性,但大多数情况下,这些检查是不必要的。除非您明确告诉编译器,否则Kotlin编译器会添加运行时检查。我知道在不可为null的类型中仍然存在一些使null
为null的纠结和方法,但从概念上讲,null安全性是指消除对这些检查的需要。许多来自Java的开发人员似乎忽视了这一点,他们一直认为这是关于自动运行时检查的,这是真的。如果你有100%的Kotli