为什么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) 我试图将我的黑客从另一个问题的答案中推广出来.
它应该提供一种方法来引用一个尚未在其初始化器中构造的值(当然,不是直接,而是在lambdas和对象表达式中).
我现在所拥有的:
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)
它有效,请看这个例子:
class Holder(var x: Int = 0,
val action: () -> Unit)
val h: Holder = selfReference { Holder(0) { self.x++ } }
h.action()
h.action()
println(h.x) //2
Run Code Online (Sandbox Code Playgroud)
但在这一点上,initializer引用构造值的方式是self属性.
我的问题是:有没有办法重写SelfReference所以 …