kotlin - Kotlin 空安全是否在编译器中实现?

标签 kotlin null

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

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

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

最佳答案

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

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

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

关于kotlin - Kotlin 空安全是否在编译器中实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51526930/

相关文章:

ios - 从 Kotlin Native 继承 UIView

android - 将 Kotlin 从 1.2.31 升级到 1.2.41/1.2.50 后出现 NoClassDefFoundError

python - 如果 "null=True",存储在 DB 中,是 "NULL"还是 "empty values"?

php - Xcode- swift -NSURL : "fatal error: unexpectedly found nil while unwrapping an Optional value"

dependency-injection - 如何让@Autowired 在普通类里面工作?

constructor - 如何在 init 方法之前将函数应用于数据类构造函数中定义的值?

java - 无法创建 JBoss Seam EntityManager

java - Intent.getStringExtra ("key")返回 null

c++ - (c++) 检查指针数组的空值

android - 如何将图像添加到 jetpack compose/kotlin 中的按钮