2017-06-06 82 views
3

我在kotlin中定义了一个实例变量,并且想要初始化onCreate方法activitylateinit修饰符在Kotlin的原始类型属性上是不允许的

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

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

属性必须被初始化或科特林

好是抽象的,我读这个线程Property must be initialized or be abstract,并试图相同的,但我再次得到一个提示以下错误。

lateinit修改是不允许的原始类型的属性

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

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

+2

您可以初始化为0。 –

+0

请参阅:https://stackoverflow.com/a/44206094/3679676 –

回答

8

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

您可以使用默认值(例如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 
} 

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

我希望它有帮助。

-3

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

lateinit适用于无法在类体定义中轻松初始化的非空对象引用。

+1

尤其是随着Kotlin 1.2的发布和'isInitialized'的引入,将一个属性保留为未初始化 - 也许0和-1是非常有意义的初始化后两个合法值? – msrd0

相关问题