为什么 Kotlin 不允许您将 Lateinit 与原始类型一起使用?

问题描述 投票:0回答:3

在 Kotlin 语言中,默认情况下,我们必须在引入每个变量时对其进行初始化。为了避免这种情况,可以使用

lateinit
关键字。在初始化之前引用
lateinit
变量会导致运行时异常。

但是,

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

initialization kotlin primitive
3个回答
67
投票

对于(不可为空)对象类型,Kotlin 使用

null
值来标记
lateinit
属性尚未初始化,并在访问该属性时抛出适当的异常。

对于原始类型,没有这样的值,因此无法将属性标记为未初始化并提供

lateinit
需要提供的诊断。 (我们可以尝试使用某种单独的标记,但通过反射初始化字段时该标记不会更新,这是
lateinit
的主要用例)。

因此,

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


9
投票

一个简短的答案是,对于基元,您始终可以使用

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 }
    

-3
投票
我认为,在基元的情况下,简单地初始化它(让我说 0 并将简单值保存在内存中,而不是存储有关 Lateinit 机制使用的对象可空性的额外信息)会占用更少的资源。

如果不是这样请纠正我。

© www.soinside.com 2019 - 2024. All rights reserved.