android 类型检查在Kotlin中遇到了递归

g0czyy6m  于 2023-02-10  发布在  Android
关注(0)|答案(5)|浏览(191)
val cycleRunnable = Runnable {
        handler.postDelayed(cycleRunnable,100)
    }

错误:(219,29)类型检查遇到递归问题。最简单的解决方法:显式指定声明的类型
但它的确切java版本没有任何错误

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

jbose2ul1#

对于看到此编译器警告的任何人来说,这可能很简单,只需将代码嵌套在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()
    }
}
5rgfhyps

5rgfhyps2#

Kotlin禁止在自己的初始化式中使用变量或属性。
可以使用对象表达式实现Runnable,方法与Java中相同:

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)
    }
}
ffscu2ro

ffscu2ro3#

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

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

该方案解决了递归类型检查的大部分问题。
如果您收到错误Variable must be initialized,那么您必须首先声明变量,然后使用runnable初始化它,如下所示:

lateinit var cycleRunnable:Runnable

//in constructor or somewhere else:
cycleRunnable = Runnable {
        handler.postDelayed(cycleRunnable,100)
    }
rseugnpd

rseugnpd4#

这样如何?你可以用对象表达式替换它,这是因为你不能在lambda体中引用lambda,因为cycleRunnable还没有初始化。

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

或者如果cycleRunnable是属性,则使用惰性委派属性,例如:

val cycleRunnable: Runnable by lazy {
    Runnable { handler.postDelayed(cycleRunnable, 100) }
}
vkc1a9a2

vkc1a9a25#

只需添加特定类型:之前:瓦尔m =我的适配器{}之后:瓦尔m:我的适配器=我的适配器{}

相关问题