【问题标题】:Property must be initialized or be abstract属性必须被初始化或者是抽象的
【发布时间】:2016-02-24 07:20:44
【问题描述】:

这一定是个愚蠢的问题,但我对 Kotlin 真的很陌生,我没有找到任何解决方案。

如何声明类字段?就像我们可以在 java 中一样:

protected SharedPreferences mSharedPreferences;

后来在onCreate()

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

现在我可以在任何我想要的地方使用它(在这个基础活动的子类中)。

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

protected var sharedPreferences : SharedPreferences

onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

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

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    如果您想在构造函数之外初始化一个属性,那么late-initialized properties 可能就是您要寻找的。使用lateinit 修饰符声明属性,这将允许跳过其他需要的初始化程序,并使属性访问失败并出现异常,直到为其分配了一些有意义的值:

    protected lateinit var sharedPreferences: SharedPreferences
    

    【讨论】:

    • 我尝试使用“protected var sharedPreferences : SharedPreferences?= null”,它也有效,有什么区别?
    • 我看到如果我使用 Dagger2 进行 DI,我必须使用你的变体,对吗?
    • 不同之处在于你可以用lateinit声明不可为空的值。
    【解决方案2】:

    从 Alexander Udalov 的答案中将其从 cmets 中提取出来以提高知名度。 对于可为空的属性:

    protected var sharedPreferences : SharedPreferences? = null

    ...稍后再为其赋值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      相关资源
      最近更新 更多