val cycleRunnable = Runnable {
handler.postDelayed(cycleRunnable,100)
}
错误:(219,29)类型检查遇到递归问题。最简单的解决方法:显式指定声明的类型
但它的确切java版本没有任何错误
private final Runnable cycleRunnable = new Runnable() {
public void run() {
handler.postDelayed(cycleRunnable, POST_DELAY);
}
};
5条答案
按热度按时间jbose2ul1#
对于看到此编译器警告的任何人来说,这可能很简单,只需将代码嵌套在
Unit
(又名{ ... }
)中即可Kotlin允许我们分配函数:
然而,如果我们递归调用函数,这就不起作用了:
解决办法很简单:
5rgfhyps2#
Kotlin禁止在自己的初始化式中使用变量或属性。
可以使用对象表达式实现
Runnable
,方法与Java中相同:另一种方法是使用某个函数返回
Runnable
,并在传递给它的lambda中使用cycleRunnable
,例如:或者通过自引用查看a workaround that allows a variable to be used inside its own initializer:
此代码无法在开箱即用的情况下工作:你需要从上面的链接添加utils或者使用
kotlin-fun
库:ffscu2ro3#
显式显示值类型,如下所示:
该方案解决了递归类型检查的大部分问题。
如果您收到错误
Variable must be initialized
,那么您必须首先声明变量,然后使用runnable初始化它,如下所示:rseugnpd4#
这样如何?你可以用对象表达式替换它,这是因为你不能在lambda体中引用lambda,因为
cycleRunnable
还没有初始化。或者如果
cycleRunnable
是属性,则使用惰性委派属性,例如:vkc1a9a25#
只需添加特定类型:之前:瓦尔m =我的适配器{}之后:瓦尔m:我的适配器=我的适配器{}