Kotlin中LateData类的lateinit变量标红报错,如何修复?
修复Kotlin中lateinit变量的红色下划线问题
你碰到的这个问题其实很常见——lateinit关键字不能直接用于基本数据类型,比如你代码里的Int。Kotlin的lateinit设计初衷是用来延迟初始化非空的引用类型(比如自定义类、字符串这些),而像Int、Double这类基本数据类型并不在它的支持范围内,所以编译器才会给你标红。
有两种简单的修复方式,你可以根据需求选择:
方案1:使用Delegates.notNull()委托(推荐,保持非空语义)
这个委托专门用来解决基本数据类型的延迟初始化需求,既能保证变量非空,又能像lateinit一样延迟赋值:
import kotlin.properties.Delegates fun main() { val lateData = LateData() with(lateData) { lateinitNumber = 10 nullableNumber?.printLog() // 注意加安全调用,避免空指针 lateinitNumber.printLog() } } fun Int.printLog() { println("Number value: $this") } class LateData { var nullableNumber: Int? = null var lateinitNumber: Int by Delegates.notNull() }
方案2:改用可空包装类型(适合能接受可空的场景)
如果你能接受变量是可空类型,也可以把Int改成Int?,不过这样就不需要lateinit了——可空类型本身默认值就是null,可以后续自由赋值:
fun main() { val lateData = LateData() with(lateData) { lateinitNumber = 10 nullableNumber?.printLog() lateinitNumber?.printLog() // 可空类型需用安全调用 } } fun Int.printLog() { println("Number value: $this") } class LateData { var nullableNumber: Int? = null var lateinitNumber: Int? = null // 去掉lateinit,改用可空类型 }
另外补充一点:你原代码里的nullableNumber.printLog()会直接报错,因为nullableNumber是Int?类型,不能直接调用非空的扩展函数,必须加上安全调用符?.才行,上面的示例已经帮你修正了这个细节。
内容的提问来源于stack exchange,提问作者JunJaBoy
相关产品推荐
相关产品推荐

