重载解析歧义。所有这些功能都匹配

JEG*_*N S 9 kotlin

我试图检查是否使用引用运算符在函数中初始化了 lateinit 变量。在这种情况下,函数名和变量名是相同的。所以 Kotlin 抛出

重载解析歧义。所有这些功能都匹配

例外。实际上这段代码有什么问题?

class ABC

class MyClass {
    private lateinit var abc: ABC

    fun abc() {
        if(!::abc.isInitialized){
            println("Hello")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

s1m*_*nw1 6

这是一个简单的名称冲突。编译器不知道您指的是方法abc还是属性abc。重命名解决了这个问题:

class MyClass {
    private lateinit var abc: ABC

    fun abcFun() {
        val prop = this::abc
        if (!::abc.isInitialized) {
            println("Hello")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


adk*_*adk 5

您可以通过提取变量并显式指定其类型来消除引用的歧义:

class ABC

class MyClass {
    private lateinit var abc: ABC

    fun abc() {

        val abc: KProperty0<ABC> = ::abc
        if(!abc.isInitialized){
            println("Hello")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


use*_*612 2

问题是您有一个名为 的属性abc,可以通过调用 Kotlin 属性访问器this.abc(有点像“getter”)来访问该属性,并且您定义了另一个同名的方法,因此它无法识别使用语法引用哪个方法::abc

IDE 的错误消息也说明了这一点:

过载分辨率模糊。所有这些功能都匹配:

  • private Final Lateinit var abc: MyClass 中定义的 ABC
  • public Final fun abc(): MyClass 中定义的单位