variable that is captured by a changing closure

QuibblerQuibbler 2025-01-19 约 3 分钟 1418 次阅读

because ‘XXX‘ is a local variable that is captured by a changing closure

Kotlin代码开发中,智能类型转换是非常有助于提高开发效率。但是在lambda函数闭包中捕获可变变量时,智能转换不适用于该变量,无论是在lambda内部还是在lambda创建后的声明范围内。

举个例子,下面的代码片段:

/*
     * Your task is to implement the indexOfMax() function so that it computes returns
     * the greatest index of the greatest element in the array, or null if the array is empty
     */
    package maxindex
    fun indexOfMax(a: IntArray): Int? {
        var maxI: Int? = null
        a.forEachIndexed { i, value ->
            if (maxI == null || value >= a[maxI]) {
                maxI = i
            }
        }
        return maxI
    }

在有些代码编辑器可能不会提醒,但是编译的时候会报这个错误:Smart cast to 'SearchResultData' is impossible, because 'currentSearchResultData' is a local variable that is captured by a changing closure

这是因为该函数可能会脱离其封闭范围,并可能稍后在不同的上下文中执行,可能多次执行,也可能并行执行。编译器必须在这种情况也生成正确的代码,因此它不会假设变量的值在空检查后保持不变,不能智能转换它。

这种编码场景目前还不能用智能类型转换,Koltin官方尚未实现该功能,可能会在将来的版本中解决。官方已有问题跟进:issue/KT-7186。

相关推荐

Parcelize:Parcelable 实现生成器
Kotlin

Parcelize:Parcelable 实现生成器

Parcelize:Parcelable 实现生成器Parcelable是安卓开发中常用的序列化方式,之前分享过一个Parcelable序列化插件,方便开发者快速生成代码,提高开发效率。1、Parcelize插件Kotlin官方也推出一个Parcelable自动生成的Gradle插件:Parcelize。1.1、引入插件在项目的build.gradle中添加:id("kotlin-parceliz

3.2k
Kotlin的继承
Kotlin

Kotlin的继承

Kotlin的继承1、超类:Any类似于Java中的Object类,Kotlin也有一个叫Any的超类,是所有类的父类,所有类都默认继承自该类。超类的定义如下,其中定义了三个函数:2、open注意上面的Any类用open修饰,表示该类可以被继承。Kotlin中的类默认都是final的,无法被继承:如果想让类可以被继承,就需要用在定义类的地方用open关键字标识该类可以被继承。3、构造器继承中涉及到

2.7k
Kotlin循环语句
Kotlin

Kotlin循环语句

Kotlin循环语句每门语言都要学一下循环语句,虽然每种语言都有for、while等循环,但总有些各自的特色。1、for循环for循环遍历集合或者数组,使用 in 关键字遍历任何提供迭代器。语法:例:先定义一个数组或集合array:遍历集合array:通常还需要用到索引index,调用集合的withIndex()方法参与循环遍历。例:使用下面的方式遍历for循环,同时获取元素当前索引index和当

2.5k