属性必须初始化或抽象


121

这肯定是一个愚蠢的问题,但是我真的是Kotlin的新手,我没有找到任何解决方案。

如何声明类字段?就像我们可以在Java中使用它一样:

protected SharedPreferences mSharedPreferences;

然后在onCreate()

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

现在,我可以在任何需要的地方使用它(在此基本活动的子类中)。

我尝试在Kotlin中做同样的事情:

protected var sharedPreferences : SharedPreferences

onCreate()

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

但我得到一个警告:“属性必须初始化或抽象”

Answers:


186

如果您想在构造函数之外初始化属性,则可能需要延迟初始化的属性。用lateinit修饰符声明属性,这将允许跳过否则需要的初始化程序,并使属性访问失败并带有异常,直到为其分配了一些有意义的值为止:

protected lateinit var sharedPreferences: SharedPreferences

12
我尝试使用“ protected var sharedPreferences:SharedPreferences?= null”,它也有效,有什么区别?
安东·史库连科

我看到如果我将Dagger2用于DI,则必须使用您的变体,对吗?
安东·史库连科

30
区别在于您可以使用lateinit声明非空值。
Kirill Rakhman

15

从亚历山大·乌达洛夫(Alexander Udalov)的答案中删除可见性。对于可为空的属性:

protected var sharedPreferences : SharedPreferences? = null

...并稍后为其分配值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.