2

试图理解 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为空的吸气剂)

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

4

2 回答 2

2

在这种情况下,您不需要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. 我在这里写过这个。

于 2018-07-18T08:13:12.997 回答
1

请注意, jingx 和 Adam Arold 的回答对当前情况有好处,但如果 的类型可以y1为空,则它不等同于您的第一个片段:如果parent不是 null,而是parent.y1,那么您的代码给出nullparent?.y1 ?: field给出field

如果您需要第一种行为,我会说实际的首选形式是

if (parent != null) parent.y1 else field // if parent is val without a custom getter
parent.let { if (it != null) it.y1 else field } // otherwise

使用hasParent您实际检查 null 并且不需要的编译器隐藏!!.

于 2018-07-18T08:47:48.407 回答