Kal*_*lja 40 primitive initialization kotlin
在Kotlin语言中,默认情况下,我们必须在引入每个变量时对其进行初始化.为避免这种情况,lateinit
可以使用关键字.lateinit
在初始化之前引用变量会导致运行时异常.
lateinit
但是,不能与原始类型一起使用.为什么会这样?
yol*_*ole 40
对于对象类型,Kotlin使用该null
值来标记lateinit
属性尚未初始化,并在访问属性时抛出相应的异常.
对于原始类型,没有这样的值,因此无法将属性标记为未初始化并提供lateinit
需要提供的诊断.(我们可以尝试使用某种单独的标记,但在通过反射初始化字段时不会更新该标记,这是一个主要的用例lateinit
).
因此,lateinit
仅支持对象类型的属性.
一个简短的回答是,对于原语,您始终可以将其0
用作默认值,并将可空类型null
用作默认值。只有不可为空的非原始类型可能需要lateinit
绕过类型安全系统。
实际上,在 Kotlin 中不需要初始化一个变量,只要它在第一次访问之前有一个值并且可以静态证明。这意味着此代码完全有效:
fun main(args: Array<String>) {
var x: Int
val y: Double
x = 0
y = x + 0.1
println("$x, $y")
}
Run Code Online (Sandbox Code Playgroud)
但是有(罕见的)初始化不能被静态证明的情况。最常见的情况是使用任何形式的依赖注入的类字段:
class Window {
@Inject lateinit parent: Parent
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12645 次 |
最近记录: |