Kotlin局部变量与字段初始化语义差异的原因探究
Kotlin局部变量与类字段的初始化差异解析
先看这段Kotlin代码:
val a: Int = 1 class A { val a: Int = a // 此处报错:a未初始化 fun f() { val a = a // 此处正常,右侧a解析为顶层变量a } }
为什么Kotlin中局部变量和类字段的初始化规则存在明显差异?
有观点提到顶层变量可能在类初始化时尚未完成初始化,但这只是部分原因,还有更多细节需要拆解。
再看一个可正常编译的示例:
class A { val a: Int = b // 编译正常 companion object { val b: Int = 1 } }
但如果把b替换为a,就会触发编译错误:
class A { val a: Int = a // 报错:a未初始化 companion object { val a: Int = 1 } }
从这些案例可以总结出:类字段的变量解析规则是先将左侧的变量名加入符号表,再查找右侧的变量引用。这和局部变量的解析逻辑截然不同——局部变量初始化时,右侧会优先查找已存在的外部变量,不会优先绑定正在定义的变量。
内容的提问来源于stack exchange,提问作者Wickoo
相关产品推荐
相关产品推荐

