10

可以通过以下方式检查成员 lateinit 变量初始化:

class MyClass {
    lateinit var foo: Any
    ...
    fun doSomething() {
        if (::foo.isInitialized) {
           // Use foo
        }
    }
}

但是,此语法不适用于本地 lateinit 变量。Lint 报告错误:“尚不支持对变量的引用”。逻辑上应该有一种方法可以做到这一点,因为 lateinit 变量在未初始化时内部为空。

有没有办法检查局部变量是否已初始化?

4

1 回答 1

15

您在问题中显示的代码在 Kotlin 1.2 及更高版本中实际上很好,因为 foo 是实例变量,而不是局部变量。您在 Alexey 的评论 ( ) 中报告和提到的错误消息Unsupported [References to variables aren't supported yet]可以由真正的局部变量触发,例如在下面的doSomethingElse方法中。

class MyClass {
    lateinit var foo: Any

    fun doSomething() {
        if (::foo.isInitialized) {  // this is fine to use in Kotlin 1.2+
           // Use foo
        }
    }
    fun doSomethingElse() {
        lateinit var bar: Any

        if (::bar.isInitialized) {  // this is currently unsupported (see link in Alexey's comment.
            // Use bar 
        }

    }

}

因此,目前似乎不支持此功能。唯一想到使用 lateinit 本地的地方是,如果本地是在 lambda 中捕获的变量?

于 2019-02-10T16:41:56.107 回答