为什么Kotlin编译器需要var属性的显式初始化器?

aga*_*aga 14 kotlin

我无法理解下面的Kotlin文档:

The initializer, getter and setter are optional. Property type is optional
if it can be inferred from the initializer or from the base class member being overridden.

Examples:
var allByDefault: Int? // error: explicit initializer required, default 
getter and setter implied
Run Code Online (Sandbox Code Playgroud)

编译器为什么需要显式初始化器的唯一解释(至少我能想出的唯一解释)是Kotlin没有属性的默认值.这样对吗?如果是这样,为什么?换句话说:Kotlin属性和Java字段(具有默认值)之间有什么区别,它们不允许我们拥有属性的默认值?

vod*_*dan 13

这很简单:在Java中,默认值为0(零)和null.但是在Kotlin中,大多数值都不可为空,所以你不能用它们初始化它们null.对于原始值,可能存在使用零初始化的默认策略,但是为了保持一致而没有这样做.但在原始数组中,默认值确实为零.

如果您确实需要初始化语义,请查看lateinit属性:https://kotlinlang.org/docs/reference/properties.html#late-initialized-properties.

该机制基本上允许使用init初始化字段null,但随后将使您从空断言中解放出来.

加成

实际上Kotlin 对初始化非常聪明.例如,有效:

val x: Int

if(something)
    x = 1
else
    x = 2

println(x)
Run Code Online (Sandbox Code Playgroud)

在这里kotlinc可能会x在使用之前进行初始化,因此代码是可以的

  • "但是在Kotlin中,大多数值都不可为空,所以你不能用null初始化它们" - 我特意询问了如下声明的属性:`var allBeDefaut:Int?`.显然,这是可以为null的变量,默认情况下可以用`null`初始化,而不是`var someVar:Int`. (3认同)