类型检查已经在kotlin中进行了递归

时间:2017-08-01 16:14:52

标签: android kotlin

 val cycleRunnable = Runnable {
        handler.postDelayed(cycleRunnable,100)
    }

我收到错误 错误:(219,29)类型检查遇到了递归问题。最简单的解决方法:明确指定声明的类型

但它确切的java版本没有任何错误

private final Runnable cycleRunnable = new Runnable() {
        public void run() {
                handler.postDelayed(cycleRunnable, POST_DELAY);
        }
    };

4 个答案:

答案 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) }
}