首页 > 解决方案 > 猫王运算符与非空断言:这些语句之间的区别?

问题描述

试图理解 Kotlin 中的 null 安全性:以下这两个语句似乎都可以正常工作并且在我的程序中可以互换:

var y1: Double = 0.0
    get() = when(hasParent) {
        true -> parent!!.y1
        else -> field
    }

var y1: Double = 0.0
    get() = parent?.y1!!

hasParent只是一个查看是否parent为空的吸气剂)

这两个在语义上是相同的,还是它们实际上是不同的表达方式,意味着不同的事物?如果它们在语义上的意思相同,那么出于某种原因,第一个是否比第二个更受欢迎?

标签: nullpointerexceptionkotlintype-safetykotlin-null-safety

解决方案


在这种情况下,您不需要hasParent. 适用的形式是这样的:\

var y1: Double = 0.0
    get() = parent?.y1 ?: field

parent.y1你的第二个 getter 的问题是它无论如何都会尝试返回,NullPointerException如果它不存在它会抛出 a 。

如果您使用 IDEA,您将收到此类问题的警告,因此它们很容易解决,但您需要了解来自 Java 代码的所谓平台类型:

val queue: Queue<String> = LinkedList()
queue.peek().toInt()

尽管.toInt()可以从Queue. 我在这里写过这个。


推荐阅读