我试图检查是否使用引用运算符在函数中初始化了 lateinit 变量。在这种情况下,函数名和变量名是相同的。所以 Kotlin 抛出
重载解析歧义。所有这些功能都匹配
例外。实际上这段代码有什么问题?
class ABC
class MyClass {
private lateinit var abc: ABC
fun abc() {
if(!::abc.isInitialized){
println("Hello")
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的名称冲突。编译器不知道您指的是方法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)
您可以通过提取变量并显式指定其类型来消除引用的歧义:
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)
问题是您有一个名为 的属性abc
,可以通过调用 Kotlin 属性访问器this.abc
(有点像“getter”)来访问该属性,并且您定义了另一个同名的方法,因此它无法识别使用语法引用哪个方法::abc
。
IDE 的错误消息也说明了这一点:
过载分辨率模糊。所有这些功能都匹配:
- private Final Lateinit var abc: MyClass 中定义的 ABC
- public Final fun abc(): MyClass 中定义的单位
归档时间: |
|
查看次数: |
10716 次 |
最近记录: |