Kotlin中的原始类型属性不允许使用lateinit修饰符

N S*_*rma 33 android kotlin

我定义像一个实例变量,kotlin并希望初始化它的onCreate方法activity.

var count: Int
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    count.inc()
}
Run Code Online (Sandbox Code Playgroud)

这里我在计数变量上得到一个以下错误.

属性必须在Kotlin中初始化或抽象

好吧,我读过这个帖子属性必须初始化或者是抽象的并且尝试相同但是我再次得到以下错误.

原始类型属性不允许使用lateinit修饰符

lateinit var count: Int
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    count.inc()
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点Kotlin

cha*_*l03 52

有几种方法可以解决此问题.

您可以使用默认值(EI初始化它0-1或其他),然后只要你的逻辑说其初始化.

或者通过使用Delegates.notNullcheck notNull告诉编译器将在此代码中稍后初始化count.

var count: Int by Delegates.notNull<Int>()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // You can not call `Int.inc()` in onCreate()` function until `count` is initialised.
    // count.inc()
    // **initialise count** 
}
Run Code Online (Sandbox Code Playgroud)

如果您需要按需计数值(如果不需要初始化onCreate),您可以使用lazy函数.仅当您要执行密集(某些计算/充气布局等)任务时才使用此选项on demand,而不仅仅是分配值.

var count:Int by lazy {
    // initialise
}
Run Code Online (Sandbox Code Playgroud)

现在您可以决定使用什么.

我希望它有所帮助.

  • 很酷的,var count:Delegates.notNull &lt;Int&gt;()的Int解决了Spring中具有@ ConfigurationProperties类的问题,该类从属性文件获取原始值,而无需提供静态默认值。 (2认同)
  • @Vampire如果您认为在某些情况下“count”可能未初始化,那么请将其设为可为空。如果可以保证 `count` 在使用之前被初始化,那么只使用 `lateinit`。例如,在构造函数中对其进行初始化将确保其初始化。 (2认同)