编译错误:智能转换为&#39; <type>&#39;是不可能的,因为&#39; <变量>&#39;是一个由更改闭包捕获的局部变量

时间:2016-08-12 23:41:30

标签: kotlin casting

为了简化我的实际用例,我们假设我想在列表中找到最大数字:

echo "$username"

但是,编译失败并出现以下错误:

  

聪明地投射到&#39; Int&#39;是不可能的,因为&#39; max&#39;是一个由更改闭包

捕获的局部变量

为什么更改闭包会阻止智能转换在此示例中工作?

2 个答案:

答案 0 :(得分:1)

感谢Ilya详细解释问题! 如果您需要解决方法,可以使用标准for(item in list){...}表达式,如下所示:

var max : Int? = null
val list = listOf(1, 2, 3)
for(item in list){
    if (max == null || item > max) {
        max = item
    }
}

答案 1 :(得分:0)

问题在于tab创建了多个闭包,每个闭包都访问int char {。}}。

如果在foreach检查后但在max之前,var在另一个闭包中设置为max会怎样?

由于每个闭包理论上可以独立工作(可能在多个线程上),但都访问相同的null,因此不能保证它在执行期间不会改变。