Gen*_*ons 16 java android kotlin
为什么Kotlin抱怨这个:
class MyActivity : Activity {
private var handler:Handler = Handler()
private var runnable: Runnable = Runnable {
/* Do something very important */
handler.postDelayed(this@MyActivity.runnable, 5000)
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨说Variable 'runnable' must be initialized
,在Line中它是由处理程序再次发布的.这在纯Java中有效:
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
@Override
public void run() {
handler.postDelayed(runnable, 5000);
}
};
Run Code Online (Sandbox Code Playgroud)
hot*_*key 19
Kotlin认为属性未初始化直到其初始化程序结束,因此它不能在自己的初始化程序中使用,即使在lambdas中也是如此.这种语义类似于其初始化程序中局部变量使用的限制.
有几种解决方法:
使用对象表达式,它允许您引用this
声明的对象:
private var runnable: Runnable = object : Runnable {
override fun run() {
/* Do something very important */
handler.postDelayed(this, 5000)
}
}
Run Code Online (Sandbox Code Playgroud)
这只适用于作为lambda的替代品的接口,并且不是很完美.
使用lateinit var
或委托财产有Delegates.notNull()
:
private lateinit var runnable: Runnable
init {
runnable = Runnable {
/* Do something very important */
handler.postDelayed(runnable, 5000)
}
}
Run Code Online (Sandbox Code Playgroud)
相同的初始化程序将使用此声明:
private var runnable: Runnable by Delegates.notNull()
Run Code Online (Sandbox Code Playgroud)class SelfReference<T>(val initializer: SelfReference<T>.() -> T) {
val self: T by lazy {
inner ?: throw IllegalStateException("Do not use `self` until initialized.")
}
private val inner = initializer()
}
fun <T> selfReference(initializer: SelfReference<T>.() -> T): T {
return SelfReference(initializer).self
}
Run Code Online (Sandbox Code Playgroud)
然后你可以写出类似的东西
private var runnable: Runnable = selfReference {
Runnable {
/* Do something very important */
handler.postDelayed(self, 5000)
}
}
Run Code Online (Sandbox Code Playgroud) 归档时间: |
|
查看次数: |
3604 次 |
最近记录: |