val cycleRunnable = Runnable {
handler.postDelayed(cycleRunnable,100)
}
我收到错误 错误:(219,29)类型检查遇到了递归问题。最简单的解决方法:明确指定声明的类型
但它确切的java版本没有任何错误
private final Runnable cycleRunnable = new Runnable() {
public void run() {
handler.postDelayed(cycleRunnable, POST_DELAY);
}
};
答案 0 :(得分:14)
Kotlin禁止在其自己的初始值设定项中使用变量或属性。
您可以使用object expression以与Java相同的方式实现Runnable
:
val cycleRunnable = object : Runnable {
override fun run() {
handler.postDelayed(this, 100)
}
}
另一种方法是使用一些函数返回Runnable
并在传递给它的lambda中使用cycleRunnable
,例如:
val cycleRunnable: Runnable = run {
Runnable {
println(cycleRunnable)
}
}
或通过自我引用查看a workaround that allows a variable to be used inside its own initializer:
此代码无法开箱即用:您需要从上面的链接添加utils或使用kotlin-fun
库:
val cycleRunnable: Runnable = selfReference {
Runnable {
handler.postDelayed(self, 100)
}
}
答案 1 :(得分:6)
对于看到此编译器警告的任何人,可能就像将代码嵌套在Unit
又名{ ... }
Kotlin允许我们分配功能:
fun doSomethingElse() = doSomething()
fun doSomething() { }
但是,如果我们以递归方式调用函数,这不起作用:
fun recursiveFunction(int: Int) =
when (int) {
1 -> { }
else -> recursiveFunction()
}
修复很简单:
fun recursiveFunction(int: Int) {
when (int) {
1 -> { }
else -> recursiveFunction()
}
}
答案 2 :(得分:3)
显式显示值类型如下:
val cycleRunnable:Runnable = Runnable {
handler.postDelayed(cycleRunnable,100)
}
答案 3 :(得分:2)
这个怎么样?你可以用object expression替换它,这是因为你不能在lambda体中引用lambda,因为cycleRunnable
尚未初始化。
val cycleRunnable = object:Runnable {
override fun run() {
handler.postDelayed(this, 100)
}
}
如果cycleRunnable
是属性,则或使用lazy委托属性,例如:
val cycleRunnable: Runnable by lazy {
Runnable { handler.postDelayed(cycleRunnable, 100) }
}