为什么Kotlin不允许使用原始类型的lateinit?

时间:2016-08-04 07:40:42

标签: initialization kotlin primitive

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

但是,

lateinit不能与原始类型一起使用。为什么会这样?

3 个答案:

答案 0 :(得分:31)

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

对于基本类型,没有这样的值,因此无法将属性标记为未初始化并提供lateinit需要提供的诊断。 (我们可以尝试使用某种单独的标记,但在通过反射初始化字段时不会更新该标记,这是lateinit)的一个主要用例。

因此,lateinit仅支持对象类型的属性。

答案 1 :(得分:2)

简短的回答是,对于原语,您始终可以使用0作为默认值,并使用可空类型null作为默认值。只有非可空的非原始类型可能需要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
}

答案 2 :(得分:0)

我认为,在使用原语的情况下,只需将其初始化为0并在内存中保存简单值,而不是存储由Lateinit机制使用的有关对象可空性的额外信息,就会花费更少的资源。

如果不是这种情况,请纠正我。