在Kotlin语言中,默认情况下,我们必须在引入变量时对每个变量进行初始化。为了避免这种情况,可以使用
然而,
lateinit
关键字。在初始化之前引用lateinit
变量会导致运行时异常。然而,
lateinit
不能与原始类型一起使用。为什么呢?lateinit
关键字。在初始化之前引用lateinit
变量会导致运行时异常。lateinit
不能与原始类型一起使用。为什么呢?0
作为默认值,对于可为空的类型,则可以使用null
作为默认值。只有非空非原始类型可能需要使用lateinit
来解决类型安全系统问题。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
}
Delegates.notNull()
。他们将lateinit
保持在较低级别、高性能和与Java反射兼容的状态。拥有这两个不同的特性是必要的,这样我们就可以在通过Java库注入的类中实现非空性。 - Tenfour04我认为对于原始类型,将其初始化为0并在内存中保存简单值比存储有关对象可空性的额外信息更节省资源,这些信息是由lateinit机制使用的。
如果我说错了,请纠正我。
lateinit Int
不能用能够保存空值的Integer
类型来表示,而在未初始化时它是允许为空的?请在答案中进行澄清。 - Ilyalateinit var int: Int?
,我不认为这会有问题,因为 Kotlin 已经用Integer
来表示Int?
。 - forresthopkinsalateinit
和?
是冲突的。前者表示一个变量在初始化后始终有某个值,而后者则表示一个变量可能有也可能没有某个值。在使用lateinit
变量时,你不需要使用?.
或者检查是否为空值。 - Gustavo Maciel