Android 类型检查在kotlin中遇到了递归问题

Android 类型检查在kotlin中遇到了递归问题,android,kotlin,Android,Kotlin,我犯了一个错误 错误:(219,29)类型检查遇到了递归问题。最简单的解决方法:显式指定声明的类型 但是它的java版本没有任何错误 val cycleRunnable = Runnable { handler.postDelayed(cycleRunnable,100) } Kotlin禁止在自己的初始值设定项中使用变量或属性 您可以使用与Java中相同的方式来实现Runnable: private final Runnable cycleRunnable = ne

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

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

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

Kotlin禁止在自己的初始值设定项中使用变量或属性

您可以使用与Java中相同的方式来实现
Runnable

private final Runnable cycleRunnable = new Runnable() {
        public void run() {
                handler.postDelayed(cycleRunnable, POST_DELAY);
        }
    };
另一种方法是使用一些函数返回
Runnable
,并在传递给它的lambda中使用
cycleRunnable
,例如:

val cycleRunnable = object : Runnable {
    override fun run() {
        handler.postDelayed(this, 100)
    }
}
或者通过自我介绍来了解:

此代码不会立即生效:您需要从上面的链接添加UTIL或使用库:


这个怎么样?您可以将其替换为,这是因为您无法引用lambda主体中的lambda,因为
循环runnable
尚未初始化

val cycleRunnable: Runnable = selfReference {
    Runnable {
        handler.postDelayed(self, 100)
    }
}
如果
cycleRunnable
是一个属性,则使用委托属性,例如:

val cycleRunnable = object:Runnable {
    override fun run() {
        handler.postDelayed(this, 100)
    }
}

对于任何看到此编译器警告的人,它可能非常简单,只需将代码嵌套在
单元
aka
{…}

Kotlin允许我们分配功能:

val cycleRunnable: Runnable by lazy {
    Runnable { handler.postDelayed(cycleRunnable, 100) }
}
但是,如果我们以递归方式调用函数,则这不起作用:

fun doSomethingElse() = doSomething()
fun doSomething() { }
解决方法很简单:

fun recursiveFunction(int: Int) =
    when (int) {
        1 -> { }
        else -> recursiveFunction()
    }

显式显示值类型,如下所示:

fun recursiveFunction(int: Int) {
    when (int) {
        1 -> { }
        else -> recursiveFunction()
    }
}
val cycleRunnable:Runnable = Runnable {
    handler.postDelayed(cycleRunnable,100)
}
此解决方案解决了大多数递归类型检查问题

如果您收到错误
必须初始化变量
,则必须首先声明变量,然后使用runnable对其进行初始化,如下所示:

fun recursiveFunction(int: Int) {
    when (int) {
        1 -> { }
        else -> recursiveFunction()
    }
}
val cycleRunnable:Runnable = Runnable {
    handler.postDelayed(cycleRunnable,100)
}

我想您可以做一些类似于对象表达式
val runnable=object:runnable的事情{…
holi java是怎么说的。如果Kotlin禁止在其自己的初始值设定项中使用变量,那么该错误不会这样说吗?该错误清楚地说明了其他内容,并提供了一个解决方法。在这种情况下,只是诊断不够清楚。有两个问题的代码中有两个错误,编译器会报告错误e关于递归类型(在许多其他情况下也可能发生)。一旦你修复了它,它会说变量必须初始化,这就是我在回答中所描述的。救了我的命。谢谢你,你的解决方案对我有效。但是,我最终能够通过显式定义返回类型来使用表达式体。这是我第二次在谷歌上找到你的答案并帮助我。我希望别忘了:)此解决方案不起作用。是的,不再显示原始错误(类型检查遇到递归问题),但显示新错误(必须初始化变量“cycleRunnable”)@KennethArgo您使用的是哪个kotlin版本?不可能出现这样的错误,因为我们正在初始化此值。我使用的所有内容都是最新版本:1.3。61@KennethArgo谢谢,我发现在最新版本中有这样的问题。我已经更新了我的答案。