为什么Kotlin不允许使用基本类型的lateinit?

在Kotlin语言中,我们默认情况下必须在引入每个变量时对其进行初始化。 为了避免这种情况,可以使用lateinit关键字。 在初始化之前引用一个lateinit变量会导致运行时异常。

然而, lateinit不能和原始类型一起使用。 为什么这样?

对于对象类型,Kotlin使用null值标记lateinit属性尚未初始化,并在访问属性时抛出相应的异常。

对于原始类型,没有这样的值,所以没有办法将属性标记为非初始化,并提供lateinit需要提供的诊断。 (我们可以尝试使用某种单独的标记,但是当通过反射来初始化字段时,该标记不会被更新,这是lateinit的主要用例)。

因此,只有对象类型的属性支持lateinit

简单的答案是,对于基元,您始终可以使用0作为默认值,并将可为空的类型作为默认值。 只有不可空的非原始类型可能需要lateinit工作来解决类型安全系统。

实际上,只要第一次访问之前有一个值,就不需要在Kotlin中初始化一个变量,并且可以被静态证明。 这意味着这个代码是完全有效的:

 fun main(args: Array<String>) { var x: Int val y: Double x = 0 y = x + 0.1 println("$x, $y") } 

但是,有些(罕见的)初始化不能被静态证明。 最常见的情况是使用任何形式的依赖注入的类字段:

 class Window { @Inject lateinit parent: Parent }