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

我在kotlin定义了一个实例变量,并且想要在一个activity kotlin方法上初始化它。

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

在这里,我得到了一个计数变量的错误。

财产必须在Kotlin初始化或抽象

那么,我读这个线程属性必须初始化或是抽象的,并尝试相同,但我又收到了一个错误。

基元类型属性不允许使用lateinit修饰符

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

Kotlin有没有办法做到这一点?

有几种方法可以解决这个问题。

你可以使用默认值(ei 0或者-1或者其他)初始化它,然后在你的逻辑说明的时候初始化它。

或者告诉编译器,通过使用Delegates.notNull检查notNull,稍后将在此代码中初始化计数。

 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** } 

如果你需要计数值(如果没有必要在onCreate初始化),你可以使用lazy函数。 只有当你有一个密集(一些计算/膨胀一个布局等)任务,你想要on demand做,而不是只分配一个值。

 var count:Int by lazy { // initialise } 

现在你可以决定使用什么。

我希望它有帮助。

没有理由让它不被初始化。 只需将其初始化为0或-1。

lateinit是用于在类体定义中不能轻易初始化的非空对象引用。