相关疑难解决方法(0)

必须初始化变量'runnable'

为什么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)

java android kotlin

16
推荐指数
1
解决办法
3604
查看次数

编写Kotlin util函数,在初始化程序中提供自引用

我试图将我的黑客从另一个问题的答案中推广出来.

它应该提供一种方法来引用一个尚未在其初始化器中构造的值(当然,不是直接,而是在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所以 …

initialization this lazy-evaluation kotlin

10
推荐指数
1
解决办法
1485
查看次数

标签 统计

kotlin ×2

android ×1

initialization ×1

java ×1

lazy-evaluation ×1

this ×1