未解决的引用:isInitialized

7

我正在尝试使用Kotlin的新功能检查lateinit属性的状态,但是出现了编译时错误Unresolved reference: isInitialized

我已经在我的build.gradle文件中配置了Kotlin版本kotlin_version = '1.2.0-beta-31'(Android Studio版本为3.0),并且还更新了相同版本的Kotlin插件。这是我的代码片段,其中我使用了isInitialized检查。

同时,还包含了一个反射库。

compile group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: '1.2.0-beta-31'

.

lateinit var k: SomeObjectType
fun instance(): SomeObjectType {
    if (::k.isInitialized) {
        k = SomeObjectType()
    }
    return k
}

你是否缺少了反射库? - joecks
我有这个编译组:'org.jetbrains.kotlin',名称:'kotlin-reflect',版本:'1.2.0-beta-31'。 - Jemo Mgebrishvili
5个回答

5
这是一个错误,如此处所述,并在v1.2-rc-1中发布。 更新: Kotlin 1.2 RC似乎可用作“1.2.0-rc-39”,因此如果您更新插件并使用此版本,则应该解决您的问题。
作为解决方法,在安装rc-1之前,在变量前缀加上this::,就像这个项目中展示的那样。
package com.example.john.so2

import android.support.v7.app.AppCompatActivity
import android.os.Bundle

data class SomeObjectType(val value: String)
lateinit var k: SomeObjectType

class MainActivity : AppCompatActivity() {

    lateinit var k: SomeObjectType

    fun instance(): SomeObjectType {

        if (this::k.isInitialized) {
            return k
        } else {
            return SomeObjectType("k was not initialized")
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        println("instance = ${instance()}")
        k = SomeObjectType("k was initialized")
        println("instance = ${instance()}")
    }


}

其结果为:

11-03 19:31:14.496 31982-31982/com.example.john.so2 I/System.out: instance = SomeObjectType(value=k was not initialized)
11-03 19:31:14.496 31982-31982/com.example.john.so2 I/System.out: instance = SomeObjectType(value=k was initialized)

顺便说一句,我保留了我的原始答案,因为它突出了正确语法在“在线尝试”中的工作。


我只是在尝试最终版的 Kotlin 1.2 和 1.2.0 Android Studio 3.0 插件,但我仍然在 IDE 中看到我的代码中的 isInitialized 是红色的,并显示工具提示:未解决的引用: isInitialized。然而,代码编译并按预期运行。尝试显示 Kotlin 字节码会在那一行上导致 NullPointerException。 - Neal Sanche
在尝试这个之后,我也看到了“未解决的引用:isInitialized”,但那是因为我在我的“build.gradle”中缺少了这个:implementation "org.jetbrains.kotlin:kotlin-reflect:1.2.10" - jpihl

1

对于本地的lateinit变量,isInitialized无法使用,但对于全局变量可以正常使用。


0
如果isInitialized显示为红色,请检查您是否将Kotlin版本升级到>1.2。
在您的项目和模块Gradle文件中都要进行检查:
  1. 在您的项目Gradle中检查以下行:

    ext.kotlin_version = "1.2.21"

  2. 在您的模块Gradle中检查以下行:

    compile 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.21'

尽管有其他评论,但在我的情况下,不需要添加反射库。
"org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion"

这对我没有解决问题。我有: ext.kotlin_version = '1.2.21' 和 compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version",但 "isInitialized" 显示为红色。 - saltandpepper

0
你的代码是有效的 Kotlin 代码吗? 我尝试了以下内容,似乎按预期工作。
data class SomeObjectType(val value: String) 

lateinit var k: SomeObjectType

fun instance(): SomeObjectType {
    if (::k.isInitialized) {
        return k 
    } else {
        return SomeObjectType("k was not initialized")
    }
}

fun main(args: Array<String>) {
    println("inst = ${instance()}")
    k = SomeObjectType("was initialized")
    println("inst = ${instance()}")
}

生成:

inst = SomeObjectType(value=k was not initialized)
inst = SomeObjectType(value=was initialized)

当我尝试你上面的代码时:(加上了class SomeObjectType()
class SomeObjectType()
lateinit var k: SomeObjectType
fun instance(): SomeObjectType {
    if (::k.isInitialized) {
        instance = SomeObjectType()
    }
    return instance
}

它抱怨关于instance = SomeObjectType()行和return instance行,我认为这对我来说是有意义的。第5行是instance = SomeObjectType(),第7行是return instance行。

Error:(5, 8) Function invocation 'instance()' expected
Error:(5, 8) Variable expected
Error:(7, 11) Function invocation 'instance()' expected

以下是在线示例的链接。 可运行示例, 错误示例


我已经尝试过在线示例并且它可以运行,我尝试了字符串。此外,在我的Android项目中,我复制并粘贴了字符串类型的示例,但是我仍然遇到了相同的问题。 - Jemo Mgebrishvili
我在问题中错过了变量名,应该是k而不是instance,我已经更新了代码片段。 - Jemo Mgebrishvili

0

Project_level.gradle

buildscript {
    ext.kotlin_version = '1.2.30'

    ...
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    ...
    }
}

App_level.gradle

dependencies {
    ...
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    ...
}

使用方法

class Foo() {

    lateinit var theVariable: String

    // this is required to access isInitialized
    fun foo() {
        this::theVariable.isInitialized
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接